req.app.get('db') 在我的节点应用程序中使用 Massive JS 时未定义



我正在使用Express,Massive JS和PostgreSQL构建节点应用程序。我正在使用quelize,但决定尝试大规模的JS,所以我开始将代码转换为使用。

我有一个登录端点,我正在尝试从Angular 5应用程序达到,并且我会遇到错误。此错误仅发生在我部署的应用程序上。它确实在本地工作而没有任何问题。

这是特定错误:

TypeError: Cannot read property &#39;get_user&#39; of undefined<br> &nbsp; &nbsp;at login (/root/firstImpression/server/features/auth/authController.js:7:26)

这是我的文件夹结构:

+Server
   -server.js
   +config
     -secrets.js
   +db
     -get_user.sql
   +features
     +auth
       -authController.js
       -authRoutes.js

server.js文件内容:

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
const cookieParser = require('cookie-parser');
const secrets = require('./config/secrets');
const massive = require('massive');
// used to create, sign, and verify tokens
var jwt = require('jsonwebtoken'); 
// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));
app.use(cookieParser());
//routes 
require('./features/auth/authRoutes')(app);
//Connect to database
massive(secrets.development).then(db => {
app.set('db', db);
});
// Angular DIST output folder
app.use(express.static(path.join(__dirname, '../dist')));
//Set up static files
app.use(express.static('../dist'));
// Send all other requests to the Angular app
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../dist/index.html'));
});
//Set Port
const port = process.env.PORT || '3000';
app.set('port', port);
const server = http.createServer(app);
server.listen(port, () => console.log(`Running on localhost:${port}`));

get_user.sql文件内容:

SELECT * FROM users WHERE username = $1;

authcontroller.js文件内容:

const jwt     = require('jsonwebtoken');
const secrets = require('../../config/secrets');
const bcrypt  = require('bcrypt');
module.exports = {
    login: (req, res) => {
        req.app.get('db').get_user(req.body.username).then(user => {
          if(user[0]) {
            bcrypt.compare(req.body.password, user[0].password, 
            function(err, result) {
                if(result) {
                    var token = jwt.sign({user}, secrets.tokenSecret, 
                                {expiresIn: '1h'});
                    res.status(200).json({
                        token: token,
                        user: user
                    })
                } else {
                    res.status(200).json("Invalid username and/or 
                    password.");
                }
            });
        } else {
            res.status(200).json("Could not find that user.");
         }
      })
   }
}

authRoutes.js文件内容:

var authController = require('./authController');
module.exports = (app) => {
    app.post('/user-auth', authController.login);
}

此行上的authcontroller.js文件中发生了错误:

req.app.get('db').get_user(req.body.username)

我一直在阅读有关大规模JS的文档,并了解了将DB文件夹保持在初始化的同一级别的重要性,即我的Server.js文件。

正如我之前说过的,当我在本地机器上运行它时,它的效果很好。但是,一旦我将其部署到我的实时环境,就会收到错误。

任何帮助或方向都将不胜感激。让我知道是否需要任何其他信息,我将很乐意提供。

您的应用程序设置可能应该像

一样包裹
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
const cookieParser = require('cookie-parser');
const secrets = require('./config/secrets');
const massive = require('massive');
// used to create, sign, and verify tokens
var jwt = require('jsonwebtoken'); 
//Connect to database
massive(secrets.development).then(db => {
    // Parsers
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false}));
    app.use(cookieParser());
    app.set('db', db);
    // Angular DIST output folder
    app.use(express.static(path.join(__dirname, '../dist')));
    //routes 
    require('./features/auth/authRoutes')(app);
    //Set up static files
    app.use(express.static('../dist'));
    // Send all other requests to the Angular app
    app.get('*', (req, res) => {
        res.sendFile(path.join(__dirname, '../dist/index.html'));
    });
    //Set Port
    const port = process.env.PORT || '3000';
    app.set('port', port);
    const server = http.createServer(app);
    server.listen(port, () => console.log(`Running on localhost:${port}`));
});

最新更新