Node.js Next没有定义,但我没有';我不明白如何在我的函数中定义它
当我尝试访问/course/new时,我收到一个错误Node.js Next没有定义,但我没有';我不明白如何在我的函数中定义它,node.js,sails.js,Node.js,Sails.js,当我尝试访问/course/new时,我收到一个错误[参考错误:下一步未定义] 如何以及在何处定义故障函数的下一步? 如果我像在早期模型中那样添加一个参数next,我只会得到更多的错误 课程控制员: module.exports = { 'new':function(req, res, err){ Student.findOne(req.param('takes'), function foundStudent (err, student){ if (err) retu
[参考错误:下一步未定义]
如何以及在何处定义故障函数的下一步?
如果我像在早期模型中那样添加一个参数next
,我只会得到更多的错误
课程控制员:
module.exports = {
'new':function(req, res, err){
Student.findOne(req.param('takes'), function foundStudent (err, student){
if (err) return next(err);
if (!student) return next();
res.view({
student: student
});
});
},
create: function(req,res,next){
Course.create(req.params.all(), function courseCreated (err, course){
if(err) next(err);
res.json(course)
});
}
};
课程模式:
module.exports = {
attributes: {
code:{
type: "string"
},
name:{
type:"string"
},
takes:{
model: 'student',
required: true
}
}
};
/课程/new.ejs:
<form action="/course/create" method="post">
<h2>Create a new course for <%= student.name %></h2>
<input type="hidden" name="takes" value="<%= student.id%>"/>
<input type="text" placeholder="Course Code" name="code"><br/>
<input type="text" placeholder="Name" name="student"><br/>
<input type="submit" value="Add course"/>
</form>
我认为您需要将函数
new
的定义更改为:
'new':function(req, res, next){
问题在于:
module.exports = {
// you had err here instead of next as last argument
'new':function(req, res, next){
Student.findOne({_id:req.param('takes')}, function foundStudent (err, student){
if (err) return next(err);
if (!student) return next();
res.view({
student: student
});
});
},
create: function(req,res,next){
Course.create(req.params.all(), function courseCreated (err, course){
if(err) next(err);
res.json(course)
});
}
};
根据Sails文档,next()函数用于将中间件链接在一起。因此,传入的请求可以在到达控制器之前由中间件进行操作 我认为实施控制器方法的正确方法是:
'new':function(req, res, next){
if(!req.param.hasOwnProperty('takes')) {
res.status(400)
res.view('400', {"message":"Parameter 'takes' is required but was missing in the request"});
}
Student.findOne(req.param('takes'), function foundStudent (err, student){
if (err) {
res.status(400);
res.view('400', {"message":"Sorry, there was a problem with your request"});
if (!student){ ;
res.status(404);
res.view('404', {"message":"Sorry, there was no student found by that name or id"});
}
res.view({
student: student
});
});
},
这允许您在API中使用正确的HTTP代码。我解决了这个问题
'new':function(req, res, next){
Student.findOne({id:req.param('student')}, function foundStudent (err, student){
if (err) return next(err);
if (!student) return next();
res.view({
student: student
});
});
},
问题也出在param类型上。通过将其更改为实际想要访问的学生
模型,而不是集合获取
,它成功了
特别感谢@AJS的帮助。您应该将下一步传递到函数中
'new':function(req, res, **next**){
Student.findOne(req.param('takes'), function foundStudent (err, student){
if (err) return next(err);
if (!student) return next();
res.view({
student: student
});
});
},
@拉贾德罗特。我删除了if语句来检查err并返回next。但那没用。然后,如果我删除
err
并添加next
,则会出现另一个错误,即[error:.findOne()需要一个条件。如果您想要第一条记录,请尝试.find().limit(1)]
,这可能是因为您没有在req.param('takes')中设置值,所以找不到一个学生。您应该在使用参数之前验证它们,并且在请求中缺少必需的参数时抛出错误的请求。这里有一个指向说明此解决方案正确性的文档的链接。如果我删除了err
并添加了next
,我会收到另一个错误,即[error:.findOne()需要一个条件。如果您想要第一条记录,请尝试.find().limit(1)]
是,这意味着您的find查询犯了一个错误,与mongo实现相关,请尝试以下操作:findOne({tasks:req.param('takes'))恐怕它仍然不起作用。ReferenceError:next未定义
是否将next添加为新控制器的最后一个参数?
'new':function(req, res, **next**){
Student.findOne(req.param('takes'), function foundStudent (err, student){
if (err) return next(err);
if (!student) return next();
res.view({
student: student
});
});
},