在 NodeJS / Express / React 堆栈中记录错误
Logging errors in NodeJS / Express / React stack
我一直在使用 React 开发一个应用程序,NodeJS/Express。我的问题是,当错误发生在后端 API 服务器时,我该如何记录错误(记录到节点控制台或外部文件中)?
例如,假设我有一个 api 端点“/api/example”,它将从数据库中获取数据并处理数据。在那个过程中,我有一个数据库 class like
class DB {
update(sql) {
...
}
...
}
但是当我调用该方法时我打错了,所以我调用了 db.updates(sql)
,控制台不会显示 Uncaught error: db.updates is not a function
之类的任何错误,请求将挂起直到它终止。
所以我的问题是如何让错误出现在控制台上?这越来越烦人了,因为这比它应该占用的时间多得多。
我试过 morgan,它似乎只记录 http 请求?我也尝试过 winston,但我仍然没有在日志文件或控制台中看到任何内容(尽管我不确定如何使用它。我在最底部附上了我的 winston 记录器代码)。
我以前没有遇到过这个问题,因为我之前一直使用像ejs这样的模板视图引擎,当发生这样的错误时,ejs页面将呈现错误。现在有了 React 环境和一个只发送 json 响应的 API 服务器,页面就会进入组件的加载状态,直到获取请求失败。
任何指点将不胜感激。
谢谢。
温斯顿logger.js
import winston from 'winston'
const options = {
file: {
level: 'error',
filename: `./logs/error.log`,
handleExceptions: true,
json: true,
colorize: false,
},
console: {
level: 'error',
handleExceptions: true,
json: false,
colorize: true,
},
};
let logger = winston.createLogger({
transports: [
new winston.transports.File(options.file),
new winston.transports.Console(options.console)
],
exitOnError: true,
});
logger.stream = {
write: function (message, encoding) {
transports (file and console)
logger.info(message);
},
};
export default logger
App.js
import logger from './logger'
import morgan from 'morgan'
...
app.use( morgan('combined', {stream: logger.stream}) )
...
您可以尝试将函数调用包装在 try/catch 块中并记录捕获的错误
在我的项目中,我们在路线中遇到错误(try/catch):
router.get('/', function(req, res, next) {
try {
//get the data
res.status(200).json(data);
} catch (error) {
next(error);
}
});
并管理 app.js 中的答案:
app.use(function (err, req, res, next) {
//TODO implement error log (e.g. WINSTON)
res.status(errorStatus).json({"status": err.status, "data": err.data, "message": err.message});
});
我一直在使用 React 开发一个应用程序,NodeJS/Express。我的问题是,当错误发生在后端 API 服务器时,我该如何记录错误(记录到节点控制台或外部文件中)?
例如,假设我有一个 api 端点“/api/example”,它将从数据库中获取数据并处理数据。在那个过程中,我有一个数据库 class like
class DB {
update(sql) {
...
}
...
}
但是当我调用该方法时我打错了,所以我调用了 db.updates(sql)
,控制台不会显示 Uncaught error: db.updates is not a function
之类的任何错误,请求将挂起直到它终止。
所以我的问题是如何让错误出现在控制台上?这越来越烦人了,因为这比它应该占用的时间多得多。
我试过 morgan,它似乎只记录 http 请求?我也尝试过 winston,但我仍然没有在日志文件或控制台中看到任何内容(尽管我不确定如何使用它。我在最底部附上了我的 winston 记录器代码)。
我以前没有遇到过这个问题,因为我之前一直使用像ejs这样的模板视图引擎,当发生这样的错误时,ejs页面将呈现错误。现在有了 React 环境和一个只发送 json 响应的 API 服务器,页面就会进入组件的加载状态,直到获取请求失败。
任何指点将不胜感激。 谢谢。
温斯顿logger.js
import winston from 'winston'
const options = {
file: {
level: 'error',
filename: `./logs/error.log`,
handleExceptions: true,
json: true,
colorize: false,
},
console: {
level: 'error',
handleExceptions: true,
json: false,
colorize: true,
},
};
let logger = winston.createLogger({
transports: [
new winston.transports.File(options.file),
new winston.transports.Console(options.console)
],
exitOnError: true,
});
logger.stream = {
write: function (message, encoding) {
transports (file and console)
logger.info(message);
},
};
export default logger
App.js
import logger from './logger'
import morgan from 'morgan'
...
app.use( morgan('combined', {stream: logger.stream}) )
...
您可以尝试将函数调用包装在 try/catch 块中并记录捕获的错误
在我的项目中,我们在路线中遇到错误(try/catch):
router.get('/', function(req, res, next) {
try {
//get the data
res.status(200).json(data);
} catch (error) {
next(error);
}
});
并管理 app.js 中的答案:
app.use(function (err, req, res, next) {
//TODO implement error log (e.g. WINSTON)
res.status(errorStatus).json({"status": err.status, "data": err.data, "message": err.message});
});