如何从Express路由向Web控制台传递错误消息?前端误判请求成功
问题分析
你的问题核心在于:服务器端遇到SSH错误时,虽然返回了错误数据,但没有设置错误HTTP状态码,默认返回的是200 OK状态。AngularJS的$http会根据HTTP状态码判断请求是否成功——只要状态码在200-299之间,就会进入then的第一个成功回调,而不是错误回调。这就是为什么Chrome控制台显示success in startprocess,但服务器控制台有错误日志。
解决方案
我们需要分别修改服务器端和前端代码,让错误能正确传递到前端并触发提示:
1. 服务器端(startprocess.js)优化
- 给错误响应设置正确的HTTP状态码(比如500表示服务器内部错误)
- 避免全局变量
ssh导致的并发请求冲突 - 确保响应正确结束,避免请求挂起
修改后的代码:
var express = require('express'); var router = express.Router(); var SSH = require('simple-ssh'); router.post('/startprocess', function(req, res){ // 用let声明局部变量,避免并发请求冲突 let ssh = new SSH({ host: req.body.host, user: req.body.user, pass: req.body.pass }); ssh.exec('ls', { out: function(stdout) { console.log(stdout); // 执行成功时返回正常响应 res.status(200).send({ data: stdout }); } }).start(); ssh.on('error', function(err) { console.log('In Start, something went wrong.'); console.log(err); // 设置500状态码,告诉前端这是错误请求 res.status(500).send({ error: err.message || 'SSH连接或执行失败' }); ssh.end(); }); // 额外处理SSH连接结束的情况(可选) ssh.on('end', function() { console.log('SSH连接已结束'); }); }); module.exports = router;
2. 前端AngularJS控制器优化
- 在错误回调中捕获服务器返回的错误信息,弹出提示
- 可以用AngularJS的
$window服务或者自定义弹窗组件来显示提示
修改后的前端代码:
// 记得注入$window服务到控制器 app.controller('YourController', ['$scope', '$http', '$window', function($scope, $http, $window) { $http({ url: '/startprocess', method: "POST", data: {host: 'XX.XX.XX.XXX', user: 'XX', pass: 'YYYY'}, crossDomain: true, headers: {'Content-Type': 'application/json','charset' : 'utf-8'} }).then(function(response) { console.log('success in startprocess'); $scope.mydata = response; }, function(errorResponse) { console.log('error in startprocess'); console.log(errorResponse); // 弹出用户友好的错误提示 $window.alert('请求失败:' + (errorResponse.data.error || '未知错误')); // 也可以用自定义提示组件,比如UI Bootstrap的alert // $scope.errorMessage = errorResponse.data.error || '未知错误'; }); }]);
额外建议
- 服务器端可以更细致地划分错误类型:比如SSH连接失败用400(客户端参数错误),命令执行失败用500(服务器端错误),让前端能更精准处理
- 前端可以统一封装
$http的错误处理,比如用拦截器($httpProvider.interceptors),避免每个请求都重复写错误提示逻辑 - 注意错误信息的安全性:不要把详细的服务器错误(比如SSH的具体报错)直接返回给前端,避免泄露敏感信息,只返回用户友好的提示语
内容的提问来源于stack exchange,提问作者usersam
相关产品推荐
相关产品推荐

