Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在不重复代码的情况下处理/捕获错误?_Javascript_Node.js_Promise - Fatal编程技术网

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,以便它能够与承诺返回路由器处理程序正常工作:-)我认为将代码规范化为承诺而不是回调是完全合法的选择。关键是要把它们统一起来,使之成为一个整体