运行 npm start 后如何调试 Nodejs 应用程序错误?

Posted

技术标签:

【中文标题】运行 npm start 后如何调试 Nodejs 应用程序错误?【英文标题】:How to debug Nodejs Application Error after run npm start? 【发布时间】:2018-07-13 02:32:48 【问题描述】:

我是 Nodejs 开发的新手

我跑npm start

我明白了

> api@1.0.0 start /Users/john/Sites/project/api                                                                                                              
> export NODE_ENV=development && node index.js                                                                                                                 

 username: 'postgres',                                                                                                                                        
  password: '',                                                                                                                                                
  database: 'project',                                                                                                                                        
  host: 'localhost',                                                                                                                                           
  dialect: 'postgres'                                                                                                                                         
CompanyFeatures                                                                                                                                                
RolePermission                                                                                                                                                 
Roles                                                                                                                                                          
Features                                                                                                                                                       
/Users/john/Sites/project/api/node_modules/express/lib/router/route.js:202                                                                                   
        throw new Error(msg);                                                                                                                                  
        ^                                                                                                                                                      

Error: Route.get() requires a callback function but got a [object Undefined]                                                                                   
    at Route.(anonymous function) [as get] (/Users/john/Sites/project/api/node_modules/express/lib/router/route.js:202:15)                                   
    at Function.proto.(anonymous function) [as get] (/Users/john/Sites/project/api/node_modules/express/lib/router/index.js:510:19)                          
    at Object.<anonymous> (/Users/john/Sites/project/api/routes/authRoutes.js:59:8)                                                                          
    at Module._compile (module.js:643:30)                                                                                                                      
    at Object.Module._extensions..js (module.js:654:10)                                                                                                        
    at Module.load (module.js:556:32)                                                                                                                          
    at tryModuleLoad (module.js:499:12)                                                                                                                        
    at Function.Module._load (module.js:491:3)                                                                                                                 
    at Module.require (module.js:587:17)                                                                                                                       
    at require (internal/module.js:11:18)                                                                                                                      
    at Object.<anonymous> (/Users/john/Sites/project/api/index.js:5:25)                                                                                      
    at Module._compile (module.js:643:30)                                                                                                                      
    at Object.Module._extensions..js (module.js:654:10)                                                                                                        
    at Module.load (module.js:556:32)                                                                                                                          
    at tryModuleLoad (module.js:499:12)                                                                                                                        
    at Function.Module._load (module.js:491:3)                                                                                                                 
    at Function.Module.runMain (module.js:684:10)                                                                                                              
    at startup (bootstrap_node.js:187:16)                                                                                                                      
    at bootstrap_node.js:608:3                                                                                                                                 
npm ERR! code ELIFECYCLE                                                                                                                                       
npm ERR! errno 1                                                                                                                                               
npm ERR! api@1.0.0 start: `export NODE_ENV=development && node index.js`                                                                                       
npm ERR! Exit status 1                                                                                                                                         
npm ERR!                                                                                                                                                       
npm ERR! Failed at the api@1.0.0 start script.                                                                                                                 
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.                                                             

npm ERR! A complete log of this run can be found in:                                                                                                           
npm ERR!     /Users/john/.npm/_logs/2018-02-02T14_45_54_187Z-debug.log   

我发现了这条线

在对象。 (/Users/john/Sites/project/api/routes/authRoutes.js:59:8)

我突然查看authRoutes.js,我并没有发现那里有什么问题。

// Dependencies
const Router = require('express').Router();
const userController = require('../controllers/users');
const companyController = require('../controllers/companies');
const permissionController = require('../controllers/permission');
const roleController = require('../controllers/role');
const featureController = require('../controllers/feature');
const fs = require('fs');
const path = require('path');

// Routes
Router.get('/', (req, res) => res.status(200).send(
  message: 'Welcome to the auth test API!',
));

// Fetch user
Router.get('/info', userController.getUser);

Router.post('/profile', userController.updateProfile);

Router.post('/upload', userController.uploadImage);

Router.post('/removeUpload', async (req, res) => 
  try 
    console.log("removeUpload",req.body);
    if(req.body.filename)
      fs.unlink(req.body.filename);

    res.send(
      success: true
    );
   catch (err) 
    res.status(400).send(
      error: err
    )
  
);

Router.delete('/users', userController.deleteUser);


// Fetch User Details
Router.get('/user/:id', userController.getUserById);

// For Updating User Details
Router.put('/user', userController.updateProfileByID);

// For Removing User Details
Router.delete('/user', userController.deleteUserByID);

// For Company Operation
// Adding New Company Details
Router.post('/company', companyController.saveCompany);

// Fetch Company Details
Router.get('/company/:id', companyController.getCompany);

// Fetch Company Details
Router.get('/company', companyController.getCompanyBySession);

// Fetch All Company Details
Router.get('/companies', companyController.getCompanies);

// Fetch All Company Users Details
Router.get('/companyUser/:id', companyController.getCompanyUsers);

// For Updating Company Details
Router.put('/company', companyController.updateCompany);

// For Removing Company Details
Router.delete('/company', companyController.deleteCompany);

// For Permission Operation
// Adding New Permission Details
Router.post('/permission', permissionController.savePermission);

// Fetch Permission Details
Router.get('/permission/:id', permissionController.getPermission);

// Fetch All Permission Details
Router.get('/permissions', permissionController.getPermissions);

// For Updating Permission Details
Router.put('/permission', permissionController.updatePermission);

// For Removing Permission Details
Router.delete('/permission', permissionController.deletePermission);

/*** features ***/

Router.post('/feature', featureController.saveFeature);

// Fetch Role Details
Router.get('/feature/:id', featureController.getFeature);

// Fetch All Roles Details
Router.get('/features', featureController.getFeatures);

// For Updating Role Details
Router.put('/feature', featureController.updateFeature);

// For Removing Role Details
Router.delete('/feature', featureController.deleteFeature);

/*** roles ***/

Router.post('/role', roleController.saveRole);

// Fetch Role Details
Router.get('/role/:id', roleController.getRole);

// Fetch All Roles Details
Router.get('/roles', roleController.getRoles);

// For Updating Role Details
Router.put('/role', roleController.updateRole);

// For Removing Role Details
Router.delete('/role', roleController.deleteRole);


// Signup User
Router.post('/user', userController.createUser);

module.exports = Router;

companies.js

/******** To Perform CRUD Operation on Company ********/
const config = require('../config/config');
const Company = require('../pg/models').Company;
const User = require('../pg/models').User;
const Feature = require('../pg/models').Features;
const CompanyFeature = require('../pg/models').CompanyFeatures;
console.log(CompanyFeature);
const Permission = require('../pg/models').Permission;

const utils = require('../controllers/utils');
const moment = require('moment');
const bcrypt = require('bcrypt');
const faker = require('faker');



// Adding New Company
async function saveCompany(req, res) 
  try 
    const companyName = req.body.companyName ? req.body.companyName.trim() : null;
    const city = req.body.city ? req.body.city.trim() : '';
    const limit = req.body.limit ? req.body.limit : 200;
    const logo = req.body.logo ? req.body.logo : '';
    const features = req.body.features ? req.body.features : null;
    // const contactNumber = req.body.contactNumber ? req.body.contactNumber.trim() : '';

    if (!companyName || !city) 
      return res.status(400).send(
        error: 'Company name and City are required.'
      );
    

    if (req.user.role !== 'Super') 
      return res.status(400).send(
        error: 'You are not authorized to perform this action .Contact your admin'
      );
    

    // Check if name already exists
    let company = await Company.findAll(
      where: 
        companyName: 
          $eq: companyName
        
      ,
    );

    if (company.length) 
      return res.status(400).send(
        error: 'The Company is already registered.'
      );
    

    const newCompany = 
      companyName,
      city,
      limit,
      logo
      // contactNumber
    ;
    let company_id = '';
    let companyData = await Company.create(newCompany);

    const salt = bcrypt.genSaltSync(10);
    const hash = bcrypt.hashSync(config.defaultAdminPassword, salt);

    const companyEmail = faker.internet.email(companyName).toLowerCase();
    const companyUsername = faker.internet.userName(companyName);
    const companyfirstName = 'Company';
    const companylastName = 'Admin';

    let permissionData = await Permission.find(
      where: 
        'permissionName': 
          $eq: 'High'
        
      
    );

    // console.log(permissionData);

    const newUser = 
      userName: companyUsername,
      email: companyEmail,
      password: hash,
      firstName: companyfirstName,
      lastName: companylastName,
      updatedBy: req.user.id,
      isVerified: true,
      imagePath: logo,
      companyId: companyData.dataValues.id,
      permissionId: permissionData.dataValues.id
    ;
    // default verified with pwd
    let userData = await User.create(newUser);

    /** create features ****/
    var newCompanyFeatures = [];

    features.forEach(function (per) 

        newCompanyFeatures.push(
            company_id: companyData.dataValues.id,
            feature_id: per

        );
    );
    console.log(newCompanyFeatures);
    console.log("jai shree ram");
    await CompanyFeature.bulkCreate(newCompanyFeatures);
    return res.json(
      'success': true,
      'message': 'Successfully Created',
      'id': companyData.dataValues.id,
      'email': userData.dataValues.email
    );
   catch (err) 
    console.log("Error Adding Company.", err);
    res.status(400).send(
      error: err.message
    )
  


// Get Company
async function getCompany(req, res) 
  try 
    console.log(req.params.id);
    let company = await Company.findById(req.params.id);
    let featureData;
    featureData = await Feature.findAll();
    if (company) 
      return res.json(
        id: company.id,
        companyName: company.companyName,
        city: company.city,
        limit: company.limit,
        logo: company.logo,
        features:featureData
      );
     else 
      return res.status(401).send(
        error: 'No company found'
      );
    

   catch (err) 
    console.log("company Error", err);
    res.status(400).send(
      error: err.message
    )
  


//Get Companies
async function getCompanies(req, res) 
  try 
    console.log(req.user);
    let companyData;
    let featureData;
    if (req.user.role === 'Super') 

      featureData = await Feature.findAll();
      companyData = await Company.findAll(
        attributes: 
          exclude: ['updatedBy', 'createdAt', 'updatedAt']
        ,
        include: [
            model: User,
            attributes: ['email','userName']
          
        ],
        where: 
          'companyName': 
            $ne: 'Admin'
          
        
      );

     else if (req.user.role !== 'Super') 

      featureData = await Feature.findAll();
      companyData = await Company.findAll(
        attributes: 
          exclude: ['updatedBy', 'createdAt', 'updatedAt']
        ,
        include: [
            model: User,
            attributes: ['email','userName']
          
        ],
        where: 
          'companyName': 
            $ne: 'Admin'
          ,
          'id': req.user.companyId
        ,
      );

    

    // companyData = companyData.toJSON();
    // console.log(companyData);
    let companies = [];

    let companiesResp = await Promise.all(companyData.map(
      async company => 
        // console.log(company);
        companies.push(
          id: company.id,
          companyName: company.companyName,
          city: company.city,
          limit: company.limit,
          logo: company.logo,
          email: company.Users[0].email
        );
      ));

    return res.json(
      'companies': companies,
      'features':featureData
    );

   catch (err) 
    console.log("company Error", err);
    res.status(400).send(
      error: err.message
    )
  



//Get Users
async function getCompanyUsers(req, res) 
  try 

    // if (req.user.role !== 'Super') 
    //   return res.status(400).send(
    //     error: 'You are not authorized to perform this action .Contact your admin'
    //   );
    // 

    // let usersData = await User.findAll(
    //   where: 
    //     'companyId': 
    //       $eq: req.params.id
    //     
    //   
    // );
    let usersData;

    if (req.user.role !== 'None') 

      usersData = await User.findAll(
        attributes: 
          exclude: ['createdAt', 'updatedAt']
        ,
        include: [
            model: Permission,
            attributes: ['permissionName','priority']
          
        ],
        where: 
          'companyId': 
            $eq: req.params.id
          
        
      );

     else if (req.user.role !== 'Super') 

      usersData = await User.findAll(
        attributes: 
          exclude: ['createdAt', 'updatedAt']
        ,
        include: [
            model: Permission,
            attributes: ['permissionName','priority']
          
        ],
        where: 
          'id': 
            $eq: req.user.id
          
        
      );

    


    if (!usersData.length) 
      return res.status(400).send(
        error: 'No user for this company'
      );
    

    let users = [];

    let usersResp = await Promise.all(usersData.map(
      async user => 
        // console.log(user);
        users.push(
          id: user.id,
          firstName: user.firstName,
          lastName: user.lastName,
          userName: user.userName,
          email: user.email,
          permission: user.Permission.permissionName,
          priority: user.Permission.priority,
          isVerified: user.isVerified,
          imagePath: user.imagePath
        );
      ));

    return res.json(
      'users': users
    );

   catch (err) 
    console.log("users Error", err);
    res.status(400).send(
      error: err.message
    )
  


//Update Company
async function updateCompany(req, res) 
  try 
    let updateData = 
      'city': req.body.city,
      'limit': req.body.limit ? req.body.limit : 200,
      'logo': req.body.logo ? req.body.logo : ''
    ;
    const features = req.body.features ? req.body.features : null;

    if(req.body.companyName)
      updateData.companyName = req.body.companyName ;
    

    await Company.update(updateData, 
      where: 
        'id': 
          $eq: req.body.id
        
      
    );
    let companyDelete = await CompanyFeature.destroy(
      where: 
        'company_id': 
          $eq: req.body.id
        
      
    );
    /** create features ****/
    var newCompanyFeatures = [];

    features.forEach(function (per) 

        newCompanyFeatures.push(
            company_id: req.body.id,
            feature_id: per

        );
    );
    console.log(newCompanyFeatures);
    console.log("jai shree ram");
    await CompanyFeature.bulkCreate(newCompanyFeatures);
    return res.json(
      'success': true,
      'message': 'Successfully updated'
    );
   catch (err) 
    console.log("updateCompany Error", err);
    res.status(400).send(
      error: err.message
    )
  


//Delete Company
async function deleteCompany(req, res) 
  try 

    if (req.user.role !== 'Super') 
      return res.status(400).send(
        error: 'You are not authorized to perform this action .Contact your admin'
      );
    

    let userDelete = await User.destroy(
      where: 
        'companyId': 
          $eq: req.body.id
        
      
    );

    let companyDelete = await Company.destroy(
      where: 
        'id': 
          $eq: req.body.id
        
      
    );
    let companyfeatureData = await CompanyFeature.destroy(
      where: 
        'company_id': 
          $eq: req.body.id
        
      
    );
    console.log(userDelete,companyDelete);
    if(userDelete && companyDelete) 
      return res.json(
        'success': true,
        'message': 'Successfully deleted'
      );
     else 
      return res.status(400).send(
        error: 'No compnay found'
      );
    
   catch (err) 
    console.log("deleteCompany Error", err);
    res.status(400).send(
      error: err.message
    )
  


// Exports
module.exports = 
  saveCompany,
  getCompany,
  updateCompany,
  deleteCompany,
  getCompanies,
  getCompanyUsers
;

我看错文件了吗?

【问题讨论】:

似乎companyController.getCompanyBySession 未定义。 @JoeClay 我加了companies.js,你能再帮上一步吗。 @ihue: getCompanyBySession 不存在,但您正在尝试在路由器中注册它。您的意思是改用getCompany 吗? 知道了。我现在看到了。让我添加它。谢谢。我现在更了解如何调试了。 【参考方案1】:

您调用了一个无法在您的依赖项中解析的函数,因此它被评估为undefined。 可能你只是在函数名称中有错字,所以请确保你在authRoutes.js 中使用的函数确实存在于你的控制器文件中。

【讨论】:

【参考方案2】:

您在路由中使用了控制器中不存在的任何功能。

检查路由文件中的每个函数

【讨论】:

你能详细说明你的答案吗?

以上是关于运行 npm start 后如何调试 Nodejs 应用程序错误?的主要内容,如果未能解决你的问题,请参考以下文章

无法运行“npm start”显示错误。如何解决?

ubuntu14.04下nodejs + npm + bower的安装调试和部署

使用 nodejs/npm start 在哪里查看 console.log 输出?

安装nodejs 后运行 npm 命令无响应

npm start 在nodejs中给出错误

使用 npm start 启动服务器时出错