You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:48:03