Angular 客户端使用 Expressjs 从服务器接收 POST 请求的 OK 作为错误

Angular client receives OK as error for POST req from server with Expressjs

我正在尝试通过 node-mssql 程序包执行在 SQL 服务器中开发的存储过程。服务器端,我用的是ExpressJS,客户端是用Angular开发的。

我的问题是:node-mssql 执行存储过程没有任何问题,而 returns 没有。受影响的行数。但是在客户端,在控制台中,我得到的错误是 OK,但是响应状态是 200。由于这个错误,页面不会重定向到下一页。有人会向我解释它可以帮助我解决这个问题吗?我不知道我错过了什么。

我尝试使用 req.query 方法将数据作为普通查询(没有存储过程)插入到数据库中。它在服务器端和客户端都运行良好。我相信只有 req.execute 执行存储过程时才会响应错误消息。我更喜欢使用存储过程而不是普通的 SQL 命令将数据插入 table.

客户端 Http POST 请求:

createFlexiClaim(userid: any, claimClass: any, flexiClaim): Observable<void> {
    return this.http.post<void>(DBServerUtil.Uri + DBServerUtil.port + '/create/' + claimClass + '/' + userid, flexiClaim, 
    {
      headers: new HttpHeaders({
        'content-Type': 'application/json; charset=utf-8'
      })
    }
    )
    .pipe(catchError(this.handleError));
  }
}

ExpressJS POST 请求:

app.post('/create/:claimClass/:userid', function (req, res) {
    // (sqlqry,ClaimWBS,Docdate,typeclaim,curr,AMT,typec,empid,empname,claimfor,forrela, callback)
    // console.log(req.body.projectWbs + " : " + req.body.docDate + " : " + req.body.typeOfClaim + " : " + req.body.currencyKey + " : " + req.body.amount + " : " + req.params.claimClass + " : " + req.params.userid + " : " + req.params.userid + " : " + ":" + req.params.claimClass + " : " + req.params.userid)
    queryExe.CreateclaimPromise('CREATECLAIMDTL',req.body.projectWbs, req.body.docDate, req.body.typeOfClaim, req.body.currencyKey, req.body.amount, req.params.claimClass, req.params.userid, req.params.userid, '', '', function (recordRet, err) {
        if (err) {
            res.send("Error from app.js : "+err)
        } else {
            console.log("Message from app.js : "+recordRet)
            res.send("Message from app.js : "+JSON.stringify(recordRet))
        }
    })
})

node-mssql 连接请求:

sql.connect(setting.dbconfig).then(pool => {
        return pool.request()
            .input('PROJWBS', sql.VarChar(10), ClaimWBS)
            .input('DOCUMENTDATE', sql.Date, Docdate)
            .input('TYPEOFSUBCLAIM', sql.Int, typeclaim)
            .input('CURRENCY', sql.VarChar(5), curr)
            .input('AMOUNT', sql.Money, AMT)
            .input('CLAIMTYPE', sql.VarChar(10), typec)
            .input('EMPLOYEEID', sql.VarChar(50), empid)
            .input('EMPLOYEENAME', sql.VarChar(150), empname)
            .input('CLAIMFOR', sql.VarChar(50), claimfor)
            .input('RELATIONSHIP', sql.VarChar(50), forrela) 
            .execute(sqlqry)
    }).then(result => {
        // console.dir(result.recordset)
        callback(result.rowsAffected)
        sql.close()
    }).catch(err => {
        // console.log(err)
        callback(err)
        sql.close()
    })

我需要帮助来理解和协助我为什么在状态代码为 200 并且服务器完成其部分工作时会出现此错误。

HTTP 200 仅表示服务器 return 正常响应。如果您在服务器上包装错误并发送 200 响应,它将在浏览器上显示 200。

您需要在写回响应之前检查服务器端,在您要进行的数据库查询之后会得到什么return。

我注意到,在执行查询时,如果出现错误;该代码正在调用相同的回调,而没有单独的错误或结果参数。所以很难找到错误发生的时间。可以使用

形式的回调
callback(err, success)

使用这种形式的回调,您可以轻松识别回调中的错误和成功案例。

您可以做的真正检查是控制台记录您作为响应发送的对象,以查看发送回浏览器的内容。