Javascript 在不重复代码的情况下处理/捕获错误?
考虑以下(伪)函数来更新数据库:Javascript 在不重复代码的情况下处理/捕获错误?,javascript,node.js,promise,Javascript,Node.js,Promise,考虑以下(伪)函数来更新数据库: function my_function(req, res, input) { try { // This sanitizeInput() function throws error message if input is invalid sanitizeInput(input); catch (err) { res.status(500).json({id:"sql_error",message:err}); retur
function my_function(req, res, input) {
try {
// This sanitizeInput() function throws error message if input is invalid
sanitizeInput(input);
catch (err) {
res.status(500).json({id:"sql_error",message:err});
return;
}
dbCreateRowPromise(input)
.then(result => {//Handle success})
.catch(err => {res.status(500).json({id:"sql_error",message:err}})
}
正如你所看到的,我写了两次catch,两次都写了相同的响应,并以相同的方式处理catch。有没有什么好方法可以把这两个捕捉组合成一个捕捉 最简单的方法是为函数使用
async
/wait
语法:
async function my_function(req, res, input) {
try {
input = sanitizeInput(input);
let result = await dbCreateRowPromise(input);
// handle result
} catch (err) {
res.status(500).json({id:"sql_error",message:err});
}
}
或者,对sanitizeInput
作出承诺,这样您就可以使用承诺链接,并将其错误作为拒绝处理
var promise;
try {
promise = Promise.resolve(sanitizeInput(input));
} catch (err) {
promise = Promise.reject(err);
}
promise.then(input =>
dbCreateRowPromise(input)
).then(result => {
// Handle success
}).catch(err => {
res.status(500).json({id:"sql_error",message:err});
});
或
或
最简单的方法是为函数使用
async
/wait
语法:
async function my_function(req, res, input) {
try {
input = sanitizeInput(input);
let result = await dbCreateRowPromise(input);
// handle result
} catch (err) {
res.status(500).json({id:"sql_error",message:err});
}
}
或者,对sanitizeInput
作出承诺,这样您就可以使用承诺链接,并将其错误作为拒绝处理
var promise;
try {
promise = Promise.resolve(sanitizeInput(input));
} catch (err) {
promise = Promise.reject(err);
}
promise.then(input =>
dbCreateRowPromise(input)
).then(result => {
// Handle success
}).catch(err => {
res.status(500).json({id:"sql_error",message:err});
});
或
或
请注意,在您当前编写代码的方式中,您没有返回任何内容,下面的任何语句都将假定一切正常,因为您已经在处理
catch
,并转换响应
我想你可以用以下方式重写你的陈述:
功能清理输入(输入){
如果(输入%2==0){
抛出“不能输入偶数”;
}
返回输入;
}
函数dbCreateRowPromise(输入){
返回承诺。解析(输入);
}
函数my_函数(输入){
返回承诺。解析(输入)
.然后(消毒输入)
.然后(dbrow promise);
}
//完全正规输入
my_函数(5)
.then(out=>console.log(out))
.catch(err=>console.log('发生错误',err));
//错误输入
my_函数(4)
.then(out=>console.log(out))
.catch(err=>console.log('发生错误',err))代码>请注意,在您当前编写代码的方式中,您没有返回任何内容,以下任何语句都将假定一切正常,因为您已经在处理捕获
并转换响应
我想你可以用以下方式重写你的陈述:
功能清理输入(输入){
如果(输入%2==0){
抛出“不能输入偶数”;
}
返回输入;
}
函数dbCreateRowPromise(输入){
返回承诺。解析(输入);
}
函数my_函数(输入){
返回承诺。解析(输入)
.然后(消毒输入)
.然后(dbrow promise);
}
//完全正规输入
my_函数(5)
.then(out=>console.log(out))
.catch(err=>console.log('发生错误',err));
//错误输入
my_函数(4)
.then(out=>console.log(out))
.catch(err=>console.log('发生错误',err))代码>您所遇到的似乎是同步代码、承诺和异步回调的混合体,它们具有不同的错误处理技术
一种解决方案是只做你正在做的事情,分别处理不同类型的错误,但这可能会变得混乱和复杂。另一种方法是尝试将所有此类代码统一为一种样式,使用简单的抽象来平滑它们
我个人会尝试将所有调用规范化为异步回调样式的调用,然后以这种方式统一错误处理。例如,这里看起来您使用的是express
中间件,因此我将传递所有错误,并在错误处理程序中间件中处理它们
import { auto, constant } from 'async'
const { assign } from Object
function sanitize (opts, callback) {
const { input } = opts
try {
sanitizeInput(input)
callback()
} catch (err) {
callback(assign(err, { status: 'sanitize_error', statusCode: 500 })
}
}
function createRow (opts, callback) {
const { santizie: input } = opts
dbCreateRowPromise(input)
.then(result => callback(null, result))
.catch(err => callback(assign(err, { status: 'create_row_error', statusCode: 500 }))
}
function my_function(req, res, input, next) {
const block = {
input: constant(input),
sanitize: ['input', sanitize],
createRow: ['sanitize', createRow]
}
auto(block, (err, result) => {
if (err) return next(err)
res.status(200).json({ status: 'ok' }))
})
}
function errorHandler(err, req, res) {
res.status(err.statusCode).json(err)
}
您所遇到的似乎是同步代码、承诺和异步回调的混合体,它们具有不同的错误处理技术
一种解决方案是只做你正在做的事情,分别处理不同类型的错误,但这可能会变得混乱和复杂。另一种方法是尝试将所有此类代码统一为一种样式,使用简单的抽象来平滑它们
我个人会尝试将所有调用规范化为异步回调样式的调用,然后以这种方式统一错误处理。例如,这里看起来您使用的是express
中间件,因此我将传递所有错误,并在错误处理程序中间件中处理它们
import { auto, constant } from 'async'
const { assign } from Object
function sanitize (opts, callback) {
const { input } = opts
try {
sanitizeInput(input)
callback()
} catch (err) {
callback(assign(err, { status: 'sanitize_error', statusCode: 500 })
}
}
function createRow (opts, callback) {
const { santizie: input } = opts
dbCreateRowPromise(input)
.then(result => callback(null, result))
.catch(err => callback(assign(err, { status: 'create_row_error', statusCode: 500 }))
}
function my_function(req, res, input, next) {
const block = {
input: constant(input),
sanitize: ['input', sanitize],
createRow: ['sanitize', createRow]
}
auto(block, (err, result) => {
if (err) return next(err)
res.status(200).json({ status: 'ok' }))
})
}
function errorHandler(err, req, res) {
res.status(err.statusCode).json(err)
}
你应该考虑做卫生输入,并作出承诺。然后你可以写:
sanitizeInput(input)
.then(function(data)){
return dbCreateRowPromise(input);
})
.then(function(data)){
//success
})
.catch(function(error)){
//all failures
})
我假设你的函数返回-如果不是<代码>数据< /代码>只是空 你应该考虑让SaiIdIeEnter返回承诺。然后你可以写:
sanitizeInput(input)
.then(function(data)){
return dbCreateRowPromise(input);
})
.then(function(data)){
//success
})
.catch(function(error)){
//all failures
})
我假设你的函数返回了一些东西-如果不是数据
将只是空的这些类型的问题不会带来问题。这是开着的。@Proeviz我不这么认为,代码审查想要运行代码,伪代码并不是他们真正感兴趣的。@Icepickle这个问题是一个“如何改进代码”的问题。在这个例子中,它是否是伪代码并不重要,因为突出显示的部分是catch&try块的使用。@proeviz事实上,对我来说,它甚至看起来不像是函数代码。这些类型的问题都没有问题。这是开着的。@Proeviz我不这么认为,代码审查想要运行代码,伪代码并不是他们真正感兴趣的。@Icepickle这个问题是一个“如何改进代码”的问题。在这个例子中,它是否是伪代码并不重要,因为突出显示的部分是catch&try块的使用。@proeviz事实上,对我来说,它甚至不像是正常工作的代码。我在OPs代码中没有看到任何异步回调。为什么要从promise返回到nodeback风格?我也没有,但是包装函数函数my_function(req,res,input)
看起来像一个express函数,它实际上有一个可选的隐含回调。在开始使用回调之前,您不会深入到express中。因此,问题中可能没有明确说明,但我推断这是更广泛答案的一部分。我一直包装express,以便它能够与承诺返回路由器处理程序正常工作:-)我认为将代码规范化为承诺而不是回调是完全合法的选择。关键是要把它们统一起来,使之成为一个整体