本地正常的NodeJS登录API部署Azure App Service后报错求助
问题描述
我在Azure App Service部署一个简易登录API,本地运行正常,但Postman测试返回“DB is not available!”;部署成功后Azure显示“:( Application Error”。
应用洞察日志如下:
2022-11-21T06:18:19.890232847Z > nodemon App.js 2022-11-21T06:18:19.890236947Z 2022-11-21T06:18:21.148319009Z node:internal/modules/cjs/loader:942 2022-11-21T06:18:21.148355110Z throw err; 2022-11-21T06:18:21.148360910Z ^ 2022-11-21T06:18:21.148372410Z 2022-11-21T06:18:21.148377310Z Error: Cannot find module '../lib/cli' 2022-11-21T06:18:21.148381210Z Require stack: 2022-11-21T06:18:21.148384910Z - /home/site/wwwroot/node_modules/.bin/nodemon 2022-11-21T06:18:21.148388810Z at Module._resolveFilename (node:internal/modules/cjs/loader:939:15) 2022-11-21T06:18:21.148392710Z at Module._load (node:internal/modules/cjs/loader:780:27) 2022-11-21T06:18:21.148396510Z at Module.require (node:internal/modules/cjs/loader:1005:19) 2022-11-21T06:18:21.148400310Z at Module.patchedRequire [as require] (/usr/local/lib/node_modules/applicationinsights/node_modules/diagnostic-channel/dist/src/patchRequire.js:14:46) 2022-11-21T06:18:21.148404310Z at require (node:internal/modules/cjs/helpers:102:18) 2022-11-21T06:18:21.148407911Z at Object.<anonymous> (/home/site/wwwroot/node_modules/.bin/nodemon:3:13) 2022-11-21T06:18:21.148412411Z at Module._compile (node:internal/modules/cjs/loader:1105:14) 2022-11-21T06:18:21.148416111Z at Module._extensions..js (node:internal/modules/cjs/loader:1159:10) 2022-11-21T06:18:21.148419811Z at Module.load (node:internal/modules/cjs/loader:981:32) 2022-11-21T06:18:21.148423511Z at Module._load (node:internal/modules/cjs/loader:827:12) { 2022-11-21T06:18:21.148427211Z code: 'MODULE_NOT_FOUND', 2022-11-21T06:18:21.148430811Z requireStack: [ '/home/site/wwwroot/node_modules/.bin/nodemon' ] 2022-11-21T06:18:21.148434611Z }
我的package.json:
{ "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "nodemon App.js" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.18.2", "mysql": "^2.18.1", "nodemon": "^2.0.20" } }
API代码:
const express= require("express"); const app = express(); const bodyparser = require('body-parser') const mysql = require("./DbConnect").connection; const port = process.env.port || process.env.PORT || 3001; app.use(bodyparser.urlencoded({extended: false})) app.use(bodyparser.json()) app.post("/login", (req, res) => { let user = req.param('user',null); let password = req.param('password',null); let qry = "select * from user where username ='" + user + "' AND password='" + password + "'"; mysql.query(qry, (err, results) => { if (err) res.status(500).send("DB is not available!") else { if (results.length > 0) { res.status(200).send(results); }else{ res.status(404).send("Email Or Password InCorrect") } } }); });
请问哪里操作出错了?
问题分析与解决
1. Azure部署失败的核心原因
日志中的Cannot find module '../lib/cli'是因为nodemon是开发环境工具,不适合用于生产部署。其bin脚本依赖的文件在Azure的生产部署环境中可能未正确安装,或者环境兼容性导致加载失败。
修改package.json的启动脚本,改用node直接启动应用:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node App.js", "dev": "nodemon App.js" // 保留dev脚本用于本地开发调试 }
2. 本地Postman返回“DB is not available!”的原因
- 检查
./DbConnect.js中的数据库连接配置,确认本地数据库服务是否正常启动,连接参数(主机、端口、用户名、密码、数据库名)是否正确。 - 验证本地数据库的权限设置,确保允许当前应用程序的访问(比如MySQL是否开放localhost连接权限)。
3. 额外安全与优化建议
- 修复SQL注入漏洞:当前接口直接拼接用户输入到SQL语句中,存在严重安全风险,改用参数化查询:
let qry = "select * from user where username = ? AND password = ?"; mysql.query(qry, [user, password], (err, results) => { // 原有处理逻辑 }); - 密码加密存储:明文存储密码是极大的安全隐患,使用bcrypt等哈希算法对密码加密后再存入数据库。
- 环境变量管理:数据库连接信息不要硬编码,改为通过Azure App Service的“配置”->“应用程序设置”添加环境变量,本地开发可使用
.env文件配合dotenv包加载。
内容的提问来源于stack exchange,提问作者RadiumBall
相关产品推荐
相关产品推荐

