UnityWebRequest.downloadHandler 从节点服务器获取响应时返回空值
UnityWebRequest.downloadHandler returning null, while getting response from Node Server
我正在 Unity 上创建注册场景。在后端,我有带有 MongoDB 的 NodeJS 服务器。注册成功,数据也保存在 Mongo 上。
这是我的 NodeJS api 用于 register
api.post('/register', (req,res) => {
Account.register(new Account({username: req.body.username}), req.body.password, function(err, account){
console.log("acc: "+account);
if(err){
if (err.name == "UserExistsError") {
console.log("User Exists");
return res.status(409).send(err);
}else {
console.log("User Error 500");
return res.status(500).send(err);
}
}else {
let newUser = new User();
newUser.accountid = account._id;
newUser.name = req.body.fullname;
newUser.gender = req.body.gender;
newUser.role = req.body.role;
newUser.country = req.body.country;
newUser.coins = req.body.coins;
newUser.save(err => {
if(err){
console.log(err);
return res.send(err);
}else{
console.log('user saved');
res.json({ message: 'User saved' });
}
});
passport.authenticate(
'local', {
session: false
})(req,res, () => {
res.json({ registermsg: 'Successfully created new account'});
});
}
});
});
这是我在 Unity C#POST 中的协程
IEnumerator Post(string b) {
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(b);
using (UnityWebRequest www = new UnityWebRequest(BASE_URL, UnityWebRequest.kHttpVerbPOST)) {
UploadHandlerRaw uH = new UploadHandlerRaw(bytes);
www.uploadHandler = uH;
www.SetRequestHeader("Content-Type", "application/json");
yield return www.Send();
if (www.isError) {
Debug.Log(www.error);
} else {
lbltext.text = "User Registered";
Debug.Log(www.ToString());
Debug.Log(www.downloadHandler.text);
}
}
}
我正在尝试 Debug.Log(www.downloadHandler.text);
但我得到了 NullReferenceException
。
请问,我在api中return回复的方式是否正确?如果是,我如何在 Unity 端使用该响应。
UnityWebRequest.Post
、UnityWebRequest.Get
和其他创建 UnityWebRequest
新实例的 UnityWebRequest
将自动附加 DownloadHandlerBuffer
.
现在,如果您使用 UnityWebRequest
constructor, DownloadHandler
is not attached to that new instance. You have to manually do that with DownloadHandlerBuffer
创建 UnityWebRequest 的新实例。
IEnumerator Post(string b)
{
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(b);
using (UnityWebRequest www = new UnityWebRequest(BASE_URL, UnityWebRequest.kHttpVerbPOST))
{
UploadHandlerRaw uH = new UploadHandlerRaw(bytes);
DownloadHandlerBuffer dH = new DownloadHandlerBuffer();
www.uploadHandler = uH;
www.downloadHandler = dH;
www.SetRequestHeader("Content-Type", "application/json");
yield return www.Send();
if (www.isError)
{
Debug.Log(www.error);
}
else
{
lbltext.text = "User Registered";
Debug.Log(www.ToString());
Debug.Log(www.downloadHandler.text);
}
}
}
你只需要附加一个 DownloadHandlerBuffer ,你不需要一个新的 UnityWebRequest!
DownloadHandlerBuffer dH = new DownloadHandlerBuffer();
www.downloadHandler = dH;
我正在 Unity 上创建注册场景。在后端,我有带有 MongoDB 的 NodeJS 服务器。注册成功,数据也保存在 Mongo 上。
这是我的 NodeJS api 用于 register
api.post('/register', (req,res) => {
Account.register(new Account({username: req.body.username}), req.body.password, function(err, account){
console.log("acc: "+account);
if(err){
if (err.name == "UserExistsError") {
console.log("User Exists");
return res.status(409).send(err);
}else {
console.log("User Error 500");
return res.status(500).send(err);
}
}else {
let newUser = new User();
newUser.accountid = account._id;
newUser.name = req.body.fullname;
newUser.gender = req.body.gender;
newUser.role = req.body.role;
newUser.country = req.body.country;
newUser.coins = req.body.coins;
newUser.save(err => {
if(err){
console.log(err);
return res.send(err);
}else{
console.log('user saved');
res.json({ message: 'User saved' });
}
});
passport.authenticate(
'local', {
session: false
})(req,res, () => {
res.json({ registermsg: 'Successfully created new account'});
});
}
});
});
这是我在 Unity C#POST 中的协程
IEnumerator Post(string b) {
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(b);
using (UnityWebRequest www = new UnityWebRequest(BASE_URL, UnityWebRequest.kHttpVerbPOST)) {
UploadHandlerRaw uH = new UploadHandlerRaw(bytes);
www.uploadHandler = uH;
www.SetRequestHeader("Content-Type", "application/json");
yield return www.Send();
if (www.isError) {
Debug.Log(www.error);
} else {
lbltext.text = "User Registered";
Debug.Log(www.ToString());
Debug.Log(www.downloadHandler.text);
}
}
}
我正在尝试 Debug.Log(www.downloadHandler.text);
但我得到了 NullReferenceException
。
请问,我在api中return回复的方式是否正确?如果是,我如何在 Unity 端使用该响应。
UnityWebRequest.Post
、UnityWebRequest.Get
和其他创建 UnityWebRequest
新实例的 UnityWebRequest
DownloadHandlerBuffer
.
现在,如果您使用 UnityWebRequest
constructor, DownloadHandler
is not attached to that new instance. You have to manually do that with DownloadHandlerBuffer
创建 UnityWebRequest 的新实例。
IEnumerator Post(string b)
{
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(b);
using (UnityWebRequest www = new UnityWebRequest(BASE_URL, UnityWebRequest.kHttpVerbPOST))
{
UploadHandlerRaw uH = new UploadHandlerRaw(bytes);
DownloadHandlerBuffer dH = new DownloadHandlerBuffer();
www.uploadHandler = uH;
www.downloadHandler = dH;
www.SetRequestHeader("Content-Type", "application/json");
yield return www.Send();
if (www.isError)
{
Debug.Log(www.error);
}
else
{
lbltext.text = "User Registered";
Debug.Log(www.ToString());
Debug.Log(www.downloadHandler.text);
}
}
}
你只需要附加一个 DownloadHandlerBuffer ,你不需要一个新的 UnityWebRequest!
DownloadHandlerBuffer dH = new DownloadHandlerBuffer();
www.downloadHandler = dH;