Express / Node.js错误:引用错误:未定义Res

时间:2017-05-01 16:30:20

标签: node.js mongodb express

我正在尝试为我的小组的应用程序创建一个基本的CRUD应用程序,但我在使用基本行时遇到了一些麻烦。为了构建我的crud应用程序,我目前正在使用node.js,express和mongodb。我的部分代码遇到了一些麻烦,我想知道你是否可以指出我正确的方向。

(这是一个冗长的问题。我尽力将其格式化,以便在阅读时不会灼伤你的眼睛......对不起,如果难以阅读的话)

上下文 供我参考:

res.render(view, locals)
    ReferenceError: res is not defined
        at Object.<anonymous> (C:\Users\hcqph\xx\xcxx\server.js:35:1)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:393:7)
        at startup (bootstrap_node.js:150:9)
        at bootstrap_node.js:508:3

我的问题:每次初始化res.render(view,locals)时,我的节点服务器崩溃了。这是我得到的错误。

res.render(views, locals)

我的代码: 到目前为止,这是我对server.js的看法。现在,每当我尝试导入我的index.ejs文件时,每当我尝试导入以下行时,我都会收到错误:

    const express = require('express');
    const bodyParser = require('body-parser')
    const app = express();
    const MongoClient = require('mongodb').MongoClient

  var db

    MongoClient.connect('mongodb://omittedforprivacy', (err, database) => {
        if (err) return console.log(err)
        db = database

        app.listen(3000, () => {
            console.log('connected to mongoDB successfully. now listening on port 3000 ')
        })

    })

    /* -------- for team documentation --------
    BODYPARSER makes it possible to handle reading data from form element in index.html.  URLENCODED method within body-parser tells body-parser to extract data from form element and add them to the body element property in request object.
    ------------------------------------------------ */ 
    app.use(bodyParser.urlencoded({extended: true}))

    //set 'ejs' template engine, and default extension is ejs
    app.set('view engine', 'ejs')

    //CAN'T FIGURE OUT WHY THIS ISN'T WORKING
    res.render(views, locals)

    /* -------- for team documentation --------
    => = replacement for function

    app.get hand a GET request (read operation)
    ------------------------------------------------ */
    app.get('/', (req, res) => {
        //serves index.html back to browser
        res.sendFile(__dirname + '/index.html')

        //gets list of trips from mlab.com
        var cursor = db.collection('trips').find()

        //retrieves list of trips retrieved from mlab
        db.collection('trips').find().toArray(function(err, results) {
            if(err) return console.log(err)

            //renders index.ejs
            res.render('index.ejs', {trips:results})
        })
    })



    /* app.post handles a create request */
    app.post('/trips', (req, res) => {
        db.collection('trips').save(req.body, (err, result) =>{
            if (err) return console.log(err)

            console.log('saved to database')
            res.redirect('/') //causes browser to reload
        })
    })

这是我的server.js代码

Error: Can't set headers

您可以提供任何帮助我排除故障的帮助真的很感激。在过去的几个小时里,我一直坚持这一点。我以为res已经被快递定义了?为什么我被告知再次定义res?

=============================================== ============================== 编辑:

现在我收到以下错误://getting this to render? app.get('views/', (req, res, views, local) =>{ res.render(views,local) }) 发送后。这就是我现在所拥有的:

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)

最近编辑: 感谢其他人的意见和建议,我意识到我需要更改位置并实际明确定义res.render。

我现在坚持以下调试错误:

app.get('/', (req, res) => {
    //serves index.html back to browser
    res.sendFile(__dirname + '/index.html')

    //gets list of trips from mlab.com
    var cursor = db.collection('trips').find()

    //retrieves list of trips retrieved from mlab
    db.collection('trips').find().toArray(function(err, results) {
        if(err) return console.log(err)

        //renders index.ejs
        res.render('index.ejs', {trips:results})
    })
})

//set 'ejs' template engine, and default extension is ejs
app.set('view engine', 'ejs')

//getting this to render? 
app.get('views/', (req, res) =>{
    res.render(views,local)
})


/* app.post handles a create request */
app.post('/trips', (req, res) => {
    db.collection('trips').save(req.body, (err, result) =>{
        if (err) return console.log(err)

        console.log('saved to database')
        res.redirect('/') //causes browser to reload
    })
})

我已将代码更改为:

/* -------- for team documentation --------
BODYPARSER makes it possible to handle reading data from form element in index.html.  URLENCODED method within body-parser tells body-parser to extract data from form element and add them to the body element property in request object.
------------------------------------------------ */ 
app.use(bodyParser.urlencoded({extended: true}))

//set 'ejs' template engine, and default extension is ejs
app.set('view engine', 'ejs')

/* -------- for team documentation --------
=> = replacement for function

app.get hand a GET request (read operation)
------------------------------------------------ */
app.get('/', (req, res) => {
    //serves index.html back to browser
    res.sendFile(__dirname + '/index.html')

    //gets list of trips from mlab.com
    var cursor = db.collection('trips').find()

    //retrieves list of trips retrieved from mlab
    db.collection('trips').find().toArray(function(err, results) {
        if(err) return console.log(err)

        //renders index.ejs
        res.render('views/index.ejs', {trips:results})
    })
})



/* app.post handles a create request */
app.post('/trips', (req, res) => {
    db.collection('trips').save(req.body, (err, result) =>{
        if (err) return console.log(err)

        console.log('saved to database')
        res.redirect('/') //causes browser to reload
    })
})

我哪里错了?

=============================================== ======================== 编辑2:我能够通过一个调试错误并进入下一个。我完全删除了res.render并通过重新安排我的一些代码修复了我的标题问题。这是我最近的:

Error: Failed to lookup view "views/index.ejs" in views direct                      ory "C:\Users\hcqph\gitprojects\crudbeta\views"

现在我正在努力解决以下问题:

Comment.findAll({
              where:{
               $or: {
                    id : {
                        $like: 11
                    },
                    '$post.id$': {
                        $like: 23
                    },
                    '$post.autor.id$': {
                        $like: 2
                    }
                }
              },
              include: [{
                 model: Post,
                 attributes: [],
                 include: [{
                    model: Author,
                    attributes: []

                 }]
               }]
             })

2 个答案:

答案 0 :(得分:1)

它无法正常工作,因为代码中的res未定义。如果您在app.get('/')方法下看几行,则在该功能块中定义res。您需要创建另一个端点(或使用现有的app.get端点) - 例如,

app.get('/someendpoint', function(req, res) {
    // use res here
    // also must have views and local defined
    res.render(views, local);
});

express将在声明服务器端点时将请求和响应对象传递给回调函数。

答案 1 :(得分:1)

  1. 您可以在根级别调用app.render,仅在路由/中间件内调用res.render。
  2. app.render总是返回回调函数中的html,而res.render仅在您将回调函数指定为第三个参数时才这样做。如果在没有第三个参数/回调函数的情况下调用res.render,则会将呈现的html发送到状态代码为200的客户端。
  3. 请看下面的例子。

    app.render

    app.render('index', {title: 'res vs app render'}, function(err, html) {
        console.log(html)
    });
    
    没有第三个参数的

    res.render

    app.get('/render', function(req, res) {
        res.render('index', {title: 'res vs app render'})
    })
    
    带有第三个参数的

    res.render

    app.get('/render', function(req, res) {
        res.render('index', {title: 'res vs app render'}, function(err, html) {
            console.log(html);
            res.send('done');
        })
    })
    
    1. res.render在内部使用app.render呈现模板文件。
    2. can't set headers意味着你无法进入身体。
    3. res.render()函数编译你的模板(请不要使用ejs),在那里插入locals,并从这两件事中创建html输出。
    4. //在此设置所有模板都位于/views目录

      app.set('views', __dirname + '/views');
      
      // here you set that you're using `ejs` template engine, and the
      // default extension is `ejs`
      app.set('view engine', 'ejs');
      
      // here you render `local` template
      response.render("local", {local: local_json});
      

      因此,模板路径为views/(第一部分)+ local(第二部分)+ .ejs(第三部分)=== views/local.ejs