Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Next没有定义,但我没有';我不明白如何在我的函数中定义它_Node.js_Sails.js - Fatal编程技术网

Node.js Next没有定义,但我没有';我不明白如何在我的函数中定义它

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

当我尝试访问/course/new时,我收到一个错误
[参考错误:下一步未定义]

如何以及在何处定义故障函数的下一步? 如果我像在早期模型中那样添加一个参数
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
      });
    });
  },