web-dev-qa-db-ja.com

Nextは定義されていませんが、関数で定義する方法がわかりません

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

};
8
Gurkmeja101

私はそれを解決しました。

'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に特に感謝します。

1
Gurkmeja101

問題はここにあります:

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

};
9
AJS

関数newの定義を次のように変更する必要があると思います。

 'new':function(req, res, next){
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コードを使用できます。

0
Aaron Franco