【发布时间】:2016-09-11 03:47:11
【问题描述】:
我正在尝试使用 Lab 来测试一些代码。但是,由于某种原因,当我放置正确的有效负载时,我的代码什么也不做。承诺似乎没有得到回报:
'use strict';
const Server = require('../server');
const options = {
method: 'POST',
url: '/api/users',
payload: JSON.stringify({ mobile: '3342329224' })
};
Server.inject(options, (response) => {
if (response) {
console.log(response.payload);
}
else {
console.log('Nada');
}
});
如果我编辑代码使得没有负载或者它与我的 Joi 验证不匹配,那么我会得到响应:
{"statusCode":400,"error":"Bad Request","message":"child \"mobile\" fails because [\"mobile\" must be larger than or equal to 10]","validation":{"source":"payload","keys":["mobile"]}}
module.exports = {
method: 'POST',
path: '/api/users',
config: {
auth: false,
handler: (request, reply) => {
//looks up payload in db otherwise creates entry
User.findOne({
mobile: request.payload.mobile
}, (err, user) => {
if (err) {
throw err;
}
if (user) {
// uses twillio to send code
sendVerificationText(user, (err, result) => {
if (err){
throw err;
}
if (result === true) {
// this is what I expect to happen when testing
reply('code sent').code(201);
}
else {
throw Boom.badRequest(err);
}
});
}
else {
// the user should exist so....
const user = new User();
user.mobile = request.payload.mobile;
user.admin = false;
user.save((err, user) => {
if (err) {
throw Boom.badRequest(err);
}
sendVerificationText(user, (err, result) => {
if (err){
throw err;
}
if (result === true) {
reply('code sent').code(201);
}
else {
throw Boom.badRequest(err);
}
});
});
}
});
},
// Validate the payload against the Joi schema
validate: {
payload: createUserSchema
}
}
};
我应该提到,当我运行服务器并手动测试 api 时,这段代码可以工作。我想不通。
【问题讨论】:
-
我建议使用诸如 chrome 开发者工具之类的工具来检查您发送到服务器的实际请求,并将其与您用于手动测试的请求进行比较。生成的请求很可能略有不同。
-
我不熟悉 hapijs。但我从阅读文档中的第一个猜测是,您的服务器代码可能应该是:request.mobile 而不是 request.payload.mobile?只是猜测我可能会走得很远。
-
我很遥远。我做了一些研究并尝试创建一个类似的项目。我发现了导致 joi 验证挂起的问题。发布该发现的答案。
-
建议不要报错,用hapi的回复界面返回给客户端
-
createUserSchema:
'use strict'; const Joi = require('joi'); const createUserSchema = Joi.object({ mobile: Joi.number().min(10).required() }); module.exports = createUserSchema;