节点 JS 运行 但没有响应。工作但随后定期停止响应
Node JS running but not responding. Works but then periodically stops responding
我创建了我的第一个 NodeJS Api(也是第一次使用 JS),所以我遇到了一些问题,我真的很希望有一些 help/direction。
我当前的问题是 API 可以正常工作,但是时不时地(一天不止一次)它会停止响应。 (使用邮递员进行测试)。它不响应 'no response' 它只是不断尝试,好像在等待响应。
当我登录我使用的节点时:
lsof -i tcp:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 22361 [myserver] 18u IPv6 190588033 0t0 TCP *:hbci (LISTEN)
kill -9 22361
当我杀死它时,我等待 10 秒,它再次启动,因为我已经安装了 FOREVER。
问题是该节点似乎就在那里……无法正常工作。如果它崩溃了,它不会重新启动并再次工作,而是它只是“在那里”。
我该如何诊断?
我也安装了 Nodemon,但由于出现 EAINUSE 错误而无法正常工作
我已经在 VPS 上创建了文件。
在我的 Win10 PC 上使用 Visual Stdio Code 进行 SSH。
看了几个 youtube 视频来了解我 运行
我的主要js文件很基础:
js文件:
const app = require('./app');
const port = process.env.port || 3000;
app.listen(port);
目前我似乎无法找到“为什么”节点从工作和响应到停滞,运行但实际上没有工作!
很高兴分享代码,只有大约 12 个 js 文件,不想在这里放太多。
Package.json:
{
"name": "qudaapi",
"version": "1.0.0",
"description": "NodeJSAPI",
"main": "qudaserver.js",
"scripts": {
"start": "node qudaserver.js"
},
"author": "GAngel",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"morgan": "^1.10.0",
"mysql": "^2.18.1"
}
}
App.js
const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const app = express();
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use((req,res,next)=>{
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept,Authorization");
if (req.method === 'OPTIONS'){
res.header('Access-Control-Allow-Methods','PUT,POST,PATCH,DELETE,GET');
return res.status(200).json({});
}
next();
});
//Import Routes
const chemistRoutes = require('./api/routes/chemists');
const smsHxRoutes = require('./api/routes/smsHx');
const authRoute = require('./api/routes/auth');
const webhookRoutes = require('./api/routes/stripehook');
const orderRoutes = require('./api/routes/orders');
const comboDataRoutes = require('./api/routes/comboData');
const staffRoutes = require('./api/routes/staff');
const orderListsRoutes = require('./api/routes/orderLists');
const contactLogRoutes = require('./api/routes/contactLog');
const licenseRoutes = require('./api/routes/license');
//Route Middleware
app.use('/smsHx',smsHxRoutes);
app.use('/chemists',chemistRoutes);
app.use('/register',authRoute);
app.use('/stripehook',webhookRoutes);
app.use('/orders',orderRoutes);
app.use('/comboData',comboDataRoutes);
app.use('/staff',staffRoutes);
app.use('/orderLists',orderListsRoutes);
app.use('/contactLog',contactLogRoutes);
app.use('/license',licenseRoutes);
app.use((req,res,next) => {
const error = new Error('Endpoint not Found');
error.status = 404;
next(error);
})
app.use((error,req,res,next) => {
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
module.exports = app;
导致某种失败循环的部分:
//Login_Get APIkey
router.post('/login',verifyQUDA,async (req,res) => {
let loginChemist = req.body;
const realPass = loginChemist.chemistPassword;
// CHECK Password
var sqlString = "SELECT * From tblChemists WHERE userName = ?;";
connection.query(sqlString,[loginChemist.userName], async (err,rows,fields)=>{
if (rows && Array.isArray(rows) && rows.length) {
const savedHash = rows[0].chemistpass;
const chemistID = rows[0].chemistID;
const validPass = await bcrypt.compare(realPass,savedHash);
if(!validPass){
return res.status(200).json({
Result: false
})
}else{
const token = jwt.sign({_id: chemistID},process.env.TOKEN_SECRET);
res.header('auth-token',token);
return res.status(200).json({
Result: true,
API_Token: token
})
}
}
})
})
所以我的代码运行并且我可以使用 API,我似乎能够很好地使用它(所有路由)并获得预期的响应,但是如果我随机登录并进行测试,有时它会关闭并且 POSTMAN 一直在旋转等待响应但是当我检查时......它仍然是 'running'
真的很想知道我应该做什么来诊断?
编辑:
上面的代码是有时会循环或导致问题的部分。
我发现 api 实际上是 运行,因为其他 API 调用正在工作,如果我不添加 header,这个 API 调用“有效” .
因此,如果 header 不存在,或者 header API 密钥不正确,我可以获得 500 响应。
问题似乎是 header 是否正确,用户和密码是否正确有时我只是得到一个循环响应...
然而,代码确实有效,并给出了我在这里和那里需要的 API_Token,但有时只是像疯子一样循环!
您的 /login
处理程序有许多不发送任何响应的代码路径,并且缺少一些错误处理,因此您最终可能会遇到“静默”错误和挂起的请求。就个人而言,我会切换到你的数据库上的承诺 API,但在不进行结构更改的情况下,这是至少确保你始终发送响应并捕获错误的一种方法:
//Login_Get APIkey
router.post('/login', verifyQUDA, (req, res) => {
const loginChemist = req.body;
// CHECK Password
var sqlString = "SELECT * From tblChemists WHERE userName = ?;";
connection.query(sqlString, [loginChemist.userName], async (err, rows, fields) => {
try {
if (err) {
// catch database errors
console.log(err);
res.sendStatus(500);
} else if (rows && rows.length) {
const savedHash = rows[0].chemistpass;
const chemistID = rows[0].chemistID;
const realPass = loginChemist.chemistPassword;
const validPass = await bcrypt.compare(realPass, savedHash);
if (!validPass) {
res.status(200).json({ Result: false });
} else {
const token = jwt.sign({ _id: chemistID }, process.env.TOKEN_SECRET);
res.header('auth-token', token);
res.status(200).json({ Result: true, API_Token: token });
}
} else {
// send some status here when the username does not exist
// or your rows condition is not met
res.sendStatus(404);
}
} catch (e) {
// this catches any exception in this scope or await rejection
console.log(e);
res.sendStatus(500);
}
});
});
我创建了我的第一个 NodeJS Api(也是第一次使用 JS),所以我遇到了一些问题,我真的很希望有一些 help/direction。
我当前的问题是 API 可以正常工作,但是时不时地(一天不止一次)它会停止响应。 (使用邮递员进行测试)。它不响应 'no response' 它只是不断尝试,好像在等待响应。
当我登录我使用的节点时:
lsof -i tcp:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 22361 [myserver] 18u IPv6 190588033 0t0 TCP *:hbci (LISTEN)
kill -9 22361
当我杀死它时,我等待 10 秒,它再次启动,因为我已经安装了 FOREVER。
问题是该节点似乎就在那里……无法正常工作。如果它崩溃了,它不会重新启动并再次工作,而是它只是“在那里”。
我该如何诊断?
我也安装了 Nodemon,但由于出现 EAINUSE 错误而无法正常工作
我已经在 VPS 上创建了文件。
在我的 Win10 PC 上使用 Visual Stdio Code 进行 SSH。
看了几个 youtube 视频来了解我 运行
我的主要js文件很基础:
js文件:
const app = require('./app');
const port = process.env.port || 3000;
app.listen(port);
目前我似乎无法找到“为什么”节点从工作和响应到停滞,运行但实际上没有工作!
很高兴分享代码,只有大约 12 个 js 文件,不想在这里放太多。
Package.json:
{
"name": "qudaapi",
"version": "1.0.0",
"description": "NodeJSAPI",
"main": "qudaserver.js",
"scripts": {
"start": "node qudaserver.js"
},
"author": "GAngel",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"morgan": "^1.10.0",
"mysql": "^2.18.1"
}
}
App.js
const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const app = express();
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use((req,res,next)=>{
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept,Authorization");
if (req.method === 'OPTIONS'){
res.header('Access-Control-Allow-Methods','PUT,POST,PATCH,DELETE,GET');
return res.status(200).json({});
}
next();
});
//Import Routes
const chemistRoutes = require('./api/routes/chemists');
const smsHxRoutes = require('./api/routes/smsHx');
const authRoute = require('./api/routes/auth');
const webhookRoutes = require('./api/routes/stripehook');
const orderRoutes = require('./api/routes/orders');
const comboDataRoutes = require('./api/routes/comboData');
const staffRoutes = require('./api/routes/staff');
const orderListsRoutes = require('./api/routes/orderLists');
const contactLogRoutes = require('./api/routes/contactLog');
const licenseRoutes = require('./api/routes/license');
//Route Middleware
app.use('/smsHx',smsHxRoutes);
app.use('/chemists',chemistRoutes);
app.use('/register',authRoute);
app.use('/stripehook',webhookRoutes);
app.use('/orders',orderRoutes);
app.use('/comboData',comboDataRoutes);
app.use('/staff',staffRoutes);
app.use('/orderLists',orderListsRoutes);
app.use('/contactLog',contactLogRoutes);
app.use('/license',licenseRoutes);
app.use((req,res,next) => {
const error = new Error('Endpoint not Found');
error.status = 404;
next(error);
})
app.use((error,req,res,next) => {
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
module.exports = app;
导致某种失败循环的部分:
//Login_Get APIkey
router.post('/login',verifyQUDA,async (req,res) => {
let loginChemist = req.body;
const realPass = loginChemist.chemistPassword;
// CHECK Password
var sqlString = "SELECT * From tblChemists WHERE userName = ?;";
connection.query(sqlString,[loginChemist.userName], async (err,rows,fields)=>{
if (rows && Array.isArray(rows) && rows.length) {
const savedHash = rows[0].chemistpass;
const chemistID = rows[0].chemistID;
const validPass = await bcrypt.compare(realPass,savedHash);
if(!validPass){
return res.status(200).json({
Result: false
})
}else{
const token = jwt.sign({_id: chemistID},process.env.TOKEN_SECRET);
res.header('auth-token',token);
return res.status(200).json({
Result: true,
API_Token: token
})
}
}
})
})
所以我的代码运行并且我可以使用 API,我似乎能够很好地使用它(所有路由)并获得预期的响应,但是如果我随机登录并进行测试,有时它会关闭并且 POSTMAN 一直在旋转等待响应但是当我检查时......它仍然是 'running'
真的很想知道我应该做什么来诊断?
编辑: 上面的代码是有时会循环或导致问题的部分。 我发现 api 实际上是 运行,因为其他 API 调用正在工作,如果我不添加 header,这个 API 调用“有效” . 因此,如果 header 不存在,或者 header API 密钥不正确,我可以获得 500 响应。
问题似乎是 header 是否正确,用户和密码是否正确有时我只是得到一个循环响应... 然而,代码确实有效,并给出了我在这里和那里需要的 API_Token,但有时只是像疯子一样循环!
您的 /login
处理程序有许多不发送任何响应的代码路径,并且缺少一些错误处理,因此您最终可能会遇到“静默”错误和挂起的请求。就个人而言,我会切换到你的数据库上的承诺 API,但在不进行结构更改的情况下,这是至少确保你始终发送响应并捕获错误的一种方法:
//Login_Get APIkey
router.post('/login', verifyQUDA, (req, res) => {
const loginChemist = req.body;
// CHECK Password
var sqlString = "SELECT * From tblChemists WHERE userName = ?;";
connection.query(sqlString, [loginChemist.userName], async (err, rows, fields) => {
try {
if (err) {
// catch database errors
console.log(err);
res.sendStatus(500);
} else if (rows && rows.length) {
const savedHash = rows[0].chemistpass;
const chemistID = rows[0].chemistID;
const realPass = loginChemist.chemistPassword;
const validPass = await bcrypt.compare(realPass, savedHash);
if (!validPass) {
res.status(200).json({ Result: false });
} else {
const token = jwt.sign({ _id: chemistID }, process.env.TOKEN_SECRET);
res.header('auth-token', token);
res.status(200).json({ Result: true, API_Token: token });
}
} else {
// send some status here when the username does not exist
// or your rows condition is not met
res.sendStatus(404);
}
} catch (e) {
// this catches any exception in this scope or await rejection
console.log(e);
res.sendStatus(500);
}
});
});