承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)
Posted
技术标签:
【中文标题】承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)【英文标题】:Promise either never get called, or is rejected (Parse JS SDK) 【发布时间】:2016-07-20 18:20:13 【问题描述】:我正在尝试编写一个在用户对象上添加或编辑某些字段的函数。
当我尝试保存用户时,问题来了,如果我使用user.save
,Promise 被拒绝,错误为 206 UserCannotBeAlteredWithoutSessionError
。
但是,如果我获得了会话 ID(并且有关它的文档很少),则承诺永远不会得到解决,也不会被拒绝。该应用似乎只是跳转到回调。
我的功能:
function update(user, callback)
let query = new Parse.Query(Parse.User);
query.equalTo("username", user.email);
query.find().then(
(users) =>
if(users.length === 0)
callback('Non existent user');
else
let user = users[0];
// user.set('some', 'thing');
console.log('save');
user.save(/*
sessionToken: user.getSessionToken()
*/).then(
(test) =>
console.log('OK - ' + test);
callback();
, (err) =>
console.log('ERR- ' + require('util').inspect(err));
// console.log(callback.toString());
callback(error.message);
);
,
(error) =>
callback(error.message);
);
调用:
var async = require('async'),
baas = require('./baas.js');
async.waterfall([
(callback) =>
callback(null,
email: 'user@test.com',
password: 'password'
);
,
(user, callback) =>
console.log('connect');
baas.connect(() => //Initialize the connection to Parse, and declare use of masterKey
callback(null, user);
);
,
(user, callback) =>
console.log('update');
baas.update(user, (err) =>
callback(err);
);
], (err) =>
console.log('Error: ' + err);
);
日志变成: 没有会话令牌:
connect
update
save
ERR- ParseError code: 206, message: 'cannot modify user sA20iPbC1i'
使用会话令牌:
connect
update
save
我不明白承诺怎么可能只是回调而不打印任何内容,也不明白为什么在任何地方都没有引发错误。
编辑:
按照@user866762 的建议,我尝试将查询替换为Parse.User.logIn
,并使用生成的User
对象。
虽然这个解决方案给了我一个sessionToken
,但最终结果是一样的,如果我不提供会话令牌,则解析崩溃,如果我提供,则给我一个错误。
【问题讨论】:
如果你在console.log(user.getSessionToken())
之前console.log('save')
会发生什么?
@user866762:早该想到的,打印undefined
【参考方案1】:
根据Parse Dev guide:
...您无法调用任何
save
或delete
方法,除非Parse.User
是使用经过身份验证的方法获得的,例如logIn
或signUp
。
您也可以在保存之前尝试becoming 用户,但我怀疑这是否可行。
当您“获取 [ting] 会话 ID”时,我的猜测是您确实在破坏某些东西。要么 Parse 在你请求会话令牌时心脏病发作,要么当你在 save
中传递它时,你正在导致那里发生爆炸。
【讨论】:
成为用户是个坏主意,在这个功能中保持密码能够logIn
不是我喜欢的,但我会尝试的。
尝试后,我得到与不提供用户令牌时相同的错误。但是,我可以获得sessionToken
,但是我们回到与以前相同的错误,解析崩溃并且不调用promise。以上是关于承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)的主要内容,如果未能解决你的问题,请参考以下文章
解析:[PFFacebookUtils reauthorizeUser:] 回调永远不会被调用