测试oauth的时候发现成功了,但是提示 服务器内部代码指向错误,我直接认为这部分有问题
app.post('/pay', async (req, res) => {
let token = req.body.token;
let to = req.body.to;
let count = parseInt(req.body.count);
if (!/^[a-zA-Z0-9\-_]{3,20}$/.test(to)) return res.json({ code: 400, error: '用户名不合法'});
if (!token) return res.json({ code: 400, error: '缺少 Token'});
if (!authToken[token]) return res.json({ code: 403, error: 'Token 不合法'});
if (Number.isNaN(count) || count <= 0) return res.json({ code: 400, error: '不是有效数量'});
if (!authToken[token].nolimit && count > authToken[token].max) return res.json({ code: 412, error: '超出限制', count: authToken[token].max });
await updateUser(req.session);
if (!req.session.token) return res.json({ code: 403, error: '客户端被强制关闭'});
if (!req.session.user || !req.session.user.attributes || count > req.session.user.attributes.money) return res.json({ code: 400, error: '账号拥有的NL不足以支持此次转账', totalNL: req.session.user.attributes.money });
if (req.session.user.attributes.username === to) return res.json({ code: 400, error: '不能转账给自己'});
try {
if (!authToken[token].nolimit) authToken[token].max -= count;
let req = await pay(clients[authToken[token].token], to, count, 'OAuth 转账');
if (req) {
res.json({ code: 200, totalNL: req.session.user.attributes.money });
return;
}
if (!authToken[token].nolimit) authToken[token].max += count;
res.json({ code: 500, error: '我们不知道发生了什么,可能是用户没有自定义金额权限但你试图不使用 NL 默认金额' });
} catch (error) {
console.error(error);
res.json({ code: 500, error: '服务器内部代码执行出错'});
}
});
然后问题在哪呢,问题就是转账的这句 let req = await pay(clients[authToken[token].token], to, count, 'OAuth 转账');
他覆盖掉了原来的req对象,导致 res.session 变成 undefined,然后再在 undefined 读 user …
boom,然后被catch,返回服务器错误
解决方法:
let preq = await pay(clients[authToken[token].token], to, count, 'OAuth 转账');
if (preq) {
res.json({ code: 200, totalNL: req.session.user.attributes.money });
return;
}
实际上如果编辑器高级点就可以直接找到问题,纯记事本编辑的痛(