当我尝试访问/ course / new时,我收到错误[ReferenceError: next is not defined]
。
我如何以及在哪里为我的断层函数定义下一个?
如果我只是添加一个参数next
,就像我在早期模型中所做的那样,我只会得到更多错误。
courseController:
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
}
}
};
/course/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>
学生模式:
//A student can have take many courses
module.exports = {
attributes: {
name:{
type: "string",
required: true
},
username:{
type:"string"
},
courses: {
collection: 'course',
via: 'takes'
}
}
};
答案 0 :(得分:7)
问题在于:
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)
});
}
};
答案 1 :(得分:3)
我认为您需要将函数new
的定义更改为:
'new':function(req, res, next){
答案 2 :(得分:1)
我解决了。
'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类型。通过将其更改为实际想要访问的student
模型,而不是其工作的集合takes
。
特别感谢@AJS的帮助。
答案 3 :(得分:0)
根据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代码。
答案 4 :(得分:0)
您应该接下来将其传递给函数
'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
});
});
},