【发布时间】:2020-07-27 10:07:28
【问题描述】:
所以我有这个 TypeScript 函数,它可以将文档写入 firestore
exports.register = functions.https.onRequest((req:any, res:any) => {
if (req.method === 'PUT') {
res.status(403).send('Forbidden!');
return;
}
cors(req, res, () => {
const name = req.query.name;
//validations
if (!name) {
res.status(200).send("Please enter name.");
return;
}
//Other input validations....
const vkey = Math.random()*1000000000000000;
//check if user already exists in firestore
const userRef = admin.firestore().collection('users')
let userExists;
userRef.where('email', '==', email).get()
.then((snapshot: { size: any; }) => {
userExists = snapshot.size;
console.log(`user by email query size ${userExists}`);
//send error if user exists
if(userExists && userExists > 0){
res.status(200).send("Account with the same email exists");
return;
}
//add user to database
admin.firestore().collection('users').add({
name: name,
email: email,
password: password,
user: user,
vkey: vkey,
verified: 0,
token: 0
}).then((ref: { id: any; }) => {
console.log('add user account', ref.id);
res.status(200).send("Registered");
return;
});
})
.catch((err: any) => {
console.log('error getting user by email', err);
res.status(200).send("System error, please try again.");
});
});
});
我需要通过 POST 请求从我的 java 代码中调用此函数。我已经通过 GET 这样做了,但是我必须发送的数据大于 GET 可以处理的数据。(我知道 register 函数工作正常,因为我收到了响应,并且在使用 GET 进行测试时,发送的数据较少,会将文档写入firestore 没问题)我目前实现 POST 的代码是这样的:
public class UtilsUpdateUser extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... urls) {
try {
String jsonString = Utils.userToString(Utils.USER);
String data = URLEncoder.encode("name", "UTF-8") + "=" +
URLEncoder.encode(usernameString, "UTF-8");
data += "&" + URLEncoder.encode("password", "UTF-8") + "=" +
URLEncoder.encode(Utils.PASSWORD, "UTF-8");
data += "&" + URLEncoder.encode("user", "UTF-8") + "=" +
URLEncoder.encode(jsonString, "UTF-8");
data += "&" + URLEncoder.encode("email", "UTF-8") + "=" +
URLEncoder.encode(emailString, "UTF-8");
URL url = new URL(urls[0]);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
return "Internet";
}
}
@Override
protected void onPostExecute(String s) {
Log.i("MyData",s);
}
}
但此代码始终会导致“请输入姓名”。非常感谢任何帮助。
【问题讨论】:
标签: java typescript firebase google-cloud-functions