Javascript 在bash脚本中运行时,节点进程崩溃
我正在为我的客户机-服务器系统编写一个测试。服务器是一个节点进程,它一直在运行和侦听,直到被终止。 当我运行服务器,然后运行测试时,一切正常,测试通过 我试图编写一个运行服务器的bash脚本,然后才运行测试文件。结果是服务器以某种方式被杀死 bash脚本: 测试:Javascript 在bash脚本中运行时,节点进程崩溃,javascript,node.js,bash,jasmine,Javascript,Node.js,Bash,Jasmine,我正在为我的客户机-服务器系统编写一个测试。服务器是一个节点进程,它一直在运行和侦听,直到被终止。 当我运行服务器,然后运行测试时,一切正常,测试通过 我试图编写一个运行服务器的bash脚本,然后才运行测试文件。结果是服务器以某种方式被杀死 bash脚本: 测试: 'use strict'; const cp = require('child_process'); const ip = require('my-local-ip'); const utils = require('..
'use strict';
const cp = require('child_process');
const ip = require('my-local-ip');
const utils = require('../util/utils');
describe('Server and client connectivity:', () => {
it('should transfer index.html file to client', () => {
let basePath = __dirname.split('/');
basePath.pop();
basePath = basePath.join('/');
const clientPath = basePath + '/Client';
cp.execSync('node ' + clientPath + '/request', ['-t', ip(), '-p', 3300]);
expect(utils.isFileExistsInDirectory(clientPath, 'index.html')).toBe(true);
});
});
通过从测试中删除execSync命令,测试将失败,但服务器仍在后台运行
为什么在脚本中运行服务器,execSync会杀死服务器,当手动运行服务器,然后进行测试时,一切正常
编辑:
cat$输出的输出:
Server.js文件的相关部分:
const server = http.createServer((req, res) => {
console.log(`${req.method} request for ${req.url}`);
console.log(req.connection.remoteAddress);
let fileName = req.url;
if (utils.isFileExistsInDirectory(__dirname, fileName)) {
if (_.includes(fileName, '.html')) {
fs.readFile(`./${fileName}`, (err, data) => {
if (err) {
throw err; // --------- this is line 52 ----------
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
} else if (req.url.match(/.jpg$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/jpeg'});
imgStream.pipe(res);
} else if (req.url.match(/.png$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/png'});
imgStream.pipe(res);
}
} else {
fileName = cleaner.cleanFileName(fileName);
fs.writeFileSync(fileName, 'File Not Found. Please check your request.\n', err => {
if (err) {
throw err;
}
});
fs.readFile(`./${fileName}`, (err, data) => {
if (err) {
console.log("error 2");
throw err;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(data);
});
}
});
您需要使用path.join修复相对路径。运行测试时,工作目录位于运行测试的位置,这会导致相对路径中断
const server = http.createServer((req, res) => {
console.log(`${req.method} request for ${req.url}`);
console.log(req.connection.remoteAddress);
let fileName = req.url;
if (utils.isFileExistsInDirectory(__dirname, fileName)) {
if (_.includes(fileName, '.html')) {
fs.readFile(path.join(__dirname, `./${fileName}`), (err, data) => {
if (err) {
throw err;
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
} else if (req.url.match(/.jpg$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/jpeg'});
imgStream.pipe(res);
} else if (req.url.match(/.png$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/png'});
imgStream.pipe(res);
}
} else {
fileName = cleaner.cleanFileName(fileName);
fs.writeFileSync(fileName, 'File Not Found. Please check your request.\n', err => {
if (err) {
throw err;
}
});
fs.readFile(path.join(__dirname, `./${fileName}`), (err, data) => {
if (err) {
console.log("error 2");
throw err;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(data);
});
}
});
你能确认它确实会杀死服务器吗?或者只是在服务器继续运行时你的测试失败了吗?@BrahmaDev it显然会杀死服务器。这就是为什么我在npm运行测试后编写ps的原因——为了查看服务器是否正常运行,您是否可以添加cat$output的内容。@BrahmaDev是的,添加。
const server = http.createServer((req, res) => {
console.log(`${req.method} request for ${req.url}`);
console.log(req.connection.remoteAddress);
let fileName = req.url;
if (utils.isFileExistsInDirectory(__dirname, fileName)) {
if (_.includes(fileName, '.html')) {
fs.readFile(`./${fileName}`, (err, data) => {
if (err) {
throw err; // --------- this is line 52 ----------
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
} else if (req.url.match(/.jpg$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/jpeg'});
imgStream.pipe(res);
} else if (req.url.match(/.png$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/png'});
imgStream.pipe(res);
}
} else {
fileName = cleaner.cleanFileName(fileName);
fs.writeFileSync(fileName, 'File Not Found. Please check your request.\n', err => {
if (err) {
throw err;
}
});
fs.readFile(`./${fileName}`, (err, data) => {
if (err) {
console.log("error 2");
throw err;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(data);
});
}
});
const server = http.createServer((req, res) => {
console.log(`${req.method} request for ${req.url}`);
console.log(req.connection.remoteAddress);
let fileName = req.url;
if (utils.isFileExistsInDirectory(__dirname, fileName)) {
if (_.includes(fileName, '.html')) {
fs.readFile(path.join(__dirname, `./${fileName}`), (err, data) => {
if (err) {
throw err;
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
} else if (req.url.match(/.jpg$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/jpeg'});
imgStream.pipe(res);
} else if (req.url.match(/.png$/)) {
const imgPath = path.join(__dirname, 'images', fileName);
const imgStream = fs.createReadStream(imgPath);
res.writeHead(200, {'Content-Type': 'image/png'});
imgStream.pipe(res);
}
} else {
fileName = cleaner.cleanFileName(fileName);
fs.writeFileSync(fileName, 'File Not Found. Please check your request.\n', err => {
if (err) {
throw err;
}
});
fs.readFile(path.join(__dirname, `./${fileName}`), (err, data) => {
if (err) {
console.log("error 2");
throw err;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(data);
});
}
});