【问题标题】:Next is not defined, but I don't understand how to define it in my functionNext没有定义,但我不明白如何在我的函数中定义它
【发布时间】:2025-12-13 14:40:01
【问题描述】:

当我尝试访问 /course/new 时,我收到错误 [ReferenceError: next is not defined]

如何以及在哪里为我的故障功能定义下一步? 如果我只是添加一个参数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
    }
  }
};

/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'
    }
  }

};

【问题讨论】:

  • @RajAdroit。我删除了 if 语句来检查错误并返回下一个。但这没有帮助。然后我又遇到了其他错误

标签: node.js sails.js


【解决方案1】:

我认为您需要将函数new 的定义更改为:

 'new':function(req, res, next){

【讨论】:

  • 如果我删除 err 并添加 next,我会收到另一个错误提示 [Error: .findOne() requires a criteria. If you want the first record try .find().limit(1)]
  • 这可能是因为你没有在 req.param('takes') 中设置值,所以找不到单个学生
  • 您应该在使用它们之前验证参数,并在您的请求中缺少所需参数时抛出错误的请求错误。这是显示此解决方案正确的文档的链接。 sailsjs.com/documentation/concepts/middleware
【解决方案2】:

问题出在这里:

 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)
 });
}

};

【讨论】:

  • 如果我删除 err 并添加 next 而不是我收到另一个错误提示 [Error: .findOne() requires a criteria. If you want the first record try .find().limit(1)]
  • 是的,这意味着您的 find 查询出错了,与 mongo 实现有关
  • 试试这个:findOne({tasks:req.param('takes')}
  • 恐怕还是不行。 ReferenceError: next is not defined
  • 您是否添加了 next 作为 new 控制器的最后一个参数?
【解决方案3】:

根据 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】:

    我解决了。

    '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
          });
        });
      },
    

    问题也出在参数类型上。通过将其更改为实际想要访问的 student 模型,而不是集合 takes 它起作用了。

    特别感谢@AJS 的帮助。

    【讨论】:

      【解决方案5】:

      你应该将 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
            });
          });
        },
      

      【讨论】:

        【解决方案6】:

        对于和我犯同样错误的人,

        我做到了

        .get((req, res) => {
        

        而不是

        .get((req, res, next) => {
        

        我忘了下一个参数

        【讨论】: