简体   繁体   English

如何在此 node.js 应用程序的警报中获取我的 err.message?

[英]How can I get my err.message in the alert for this node.js app?

I have a PUT in a REST API that should display an error message that says "upvoted already" if the vote_score is 1 (that is, they voted already), but instead I get a generic "internal server error" message in alert which is not good UX.我在 REST API 中有一个 PUT,如果 vote_score 为 1(也就是说,他们已经投票),它应该显示一条错误消息,显示“已经投票”,但我在警报中收到一条通用的“内部服务器错误”消息,这是不好的用户体验。 That's always what the error will say with what I have tried so far.到目前为止,我所尝试的错误总是如此。

How can I get my error message to display as "upvoted already"?如何让我的错误消息显示为“已投票”? Or for that matter, how can I get any error message to show up with a message?或者就此而言,我如何获得任何错误消息以显示消息? I hope I have provided enough information with the API code followed with the front-end code.我希望我在 API 代码和前端代码之后提供了足够的信息。

What I have tried thus far is trying different things like res.status(200).json({ error: err.toString() });到目前为止我尝试过的是尝试不同的东西,比如res.status(200).json({ error: err.toString() }); and next(err) .next(err)

Hopefully something simple, I am hoping for a ELI5 type answer because I am a beginner and my error-handling game is weak.希望一些简单的事情,我希望得到 ELI5 类型的答案,因为我是初学者并且我的错误处理游戏很弱。 Thanks.谢谢。

const db = require('../db');
const express = require('express');
const debug = require('debug')('app:api:vote');
const Joi = require('joi');
const auth = require('../middleware/auth');
const admin = require('../middleware/admin');

const { required } = require('joi');
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());

// general error handler
const sendError = (err, res) => {
  debug(err);
  if (err.isJoi) {
    res.json({ error: err.details.map((x) => x.message + '.').join('\n') });
  } else {
    res.json({ error: err.message });
  }
};
router.put('/upvote/:emojiId/', auth, async (req, res, next) => {
  try {
    const schema = Joi.object({
      emoji_id: Joi.number().required(),
      user_id: Joi.number().required(),
      vote_score: Joi.number(),
    });
    const vote = await schema.validateAsync({
      emoji_id: req.params.emojiId,
      user_id: req.user.user_id,
      vote_score: 1,
    });


    if (!(await db.findVoteByUser(vote.emoji_id, vote.user_id))) {
      const upvote = await db.upvote(vote);
    } else if ((await db.findVoteByUser(vote.emoji_id, vote.user_id)) == 1) {
      throw new Error('Upvoted already');
    }

    const upvoteScore = await db.getJustUpvotesForEmoji(vote.emoji_id);
    res.json(upvoteScore);

  } catch (err) {
    res.status(500).json({ error: err.toString() });
  }
});

module.exports = router;

And the front-end...还有前端...

  $(document).on('click', '.upvote-emoji-button', (evt) => {
    const button = $(evt.currentTarget);
    const emoji_id = button.data('id');
    $.ajax({
      method: 'PUT',
      url: `/api/vote/upvote/${emoji_id}`,
      data: emoji_id,
      dataType: 'json',
    })
      .done((res) => {
        if (res.error) {
          bootbox.alert(res.error);
        } else {
          // $('#search-emoji-form').trigger('submit');
          button.addClass('btn-danger').removeClass('btn-primary');
          button.parent().next().next().html(res.upvotes);
          button.parent().next().next().next().next().html(res.vote_count);
          button.parent().next().next().next().next().next().html(res.total_score);
        }
      })
      .fail((xhr, textStatus, err) => {
        bootbox.alert(err);   
      });
  });


try to replace尝试更换

res.status(500).json({ error: err.toString() });

with

res.status(400).send(err.toString());

Documentation文档

Here is what I ended up doing.这是我最终做的。 It took care of my error and a few other things too.它也解决了我的错误和其他一些事情。 :) :)

//setup
const db = require('../db');
const express = require('express');
const debug = require('debug')('app:api:vote');
const Joi = require('joi');
const auth = require('../middleware/auth');
const admin = require('../middleware/admin');

const { required } = require('joi');
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());

// general error handler
const sendError = (err, res) => {
  debug(err);
  if (err.isJoi) {
    res.json({ error: err.details.map((x) => x.message + '.').join('\n') });
  } else {
    res.json({ error: err.message });
  }
};
router.put('/upvote/:emojiId/', auth, async (req, res, next) => {
  let vote = {};
  try {
    const schema = Joi.object({
      emoji_id: Joi.number().required(),
      user_id: Joi.number().required(),
      vote_score: Joi.number(),
    });
    vote = await schema.validateAsync({
      emoji_id: req.params.emojiId,
      user_id: req.user.user_id,
      vote_score: 1,
    });
    if (!(await db.findUserByID(req.user.user_id))) {
      throw new Error('log in again.');
    }
    const tester = await db.findVoteByUser(vote.user_id, vote.emoji_id);
    if (!(await db.findVoteByUser(vote.user_id, vote.emoji_id))) {
      await db.upvotePost(vote);
      const upvoteScore = await db.getJustUpvotesForEmoji(vote.emoji_id);
      const message = 'message';
      upvoteScore[message] = 'Upvote sent.';
      const action = 'action';
      upvoteScore[action] = 1;
      res.json(upvoteScore);
    } else if (tester.vote_score == -1) {
      await db.upvotePut(vote);
      const upvoteScore = await db.getJustUpvotesForEmoji(vote.emoji_id);
      const message = 'message';
      upvoteScore[message] = 'Downvote changed to upvote.';
      const action = 'action';
      upvoteScore[action] = 2;
      res.json(upvoteScore);
    } else {
      await db.deleteVoteByUserIdAndEmojiId(vote);
      const upvoteScore = await db.getJustUpvotesForEmoji(vote.emoji_id);
      const message = 'message';
      upvoteScore[message] = 'Upvote deleted.';
      const action = 'action';
      upvoteScore[action] = 3;
      res.json(upvoteScore);
    }
  } catch (err) {
    sendError(err, res);
  }
});

module.exports = router;

and front end..和前端..

  $(document).on('click', '.upvote-emoji-button', (evt) => {
    const button = $(evt.currentTarget);
    const emoji_id = button.data('id');
    $.ajax({
      method: 'PUT',
      url: `/api/vote/upvote/${emoji_id}`,
      data: emoji_id,
      dataType: 'json',
    })
      .done((res) => {
        if (res.error) {
          bootbox.alert(res.error);
        } else {
          if (res.action == 1) {
            button.addClass('btn-danger').removeClass('btn-primary');
            button.parent().next().next().html(res.upvotes);
            button.parent().next().next().next().next().html(res.vote_count);
            button.parent().next().next().next().next().next().html(res.total_score);
            bootbox.alert(res.message);
          } else if (res.action == 2) {
            button.addClass('btn-danger').removeClass('btn-primary');
            button.parent().next().children().addClass('btn-primary').removeClass('btn-danger');
            button.parent().next().next().html(res.upvotes);
            button.parent().next().next().next().next().html(res.vote_count);
            button.parent().next().next().next().next().next().html(res.total_score);
            bootbox.alert(res.message);
          } else if (res.action == 3) {
            button.removeClass('btn-danger').addClass('btn-primary');
            button.parent().next().next().html(res.upvotes);
            button.parent().next().next().next().next().html(res.vote_count);
            button.parent().next().next().next().next().next().html(res.total_score);
            bootbox.alert(res.message);
          }
        }
      })
      .fail((xhr, textStatus, err) => {
        bootbox.alert(err);
        // alert(`${textStatus}\n${err}\n${xhr.status}`);
      });
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从我的 Node.JS 向我的 Javascript 客户端发送一个警报? - How can I send one alert from my Node.JS to my Javascript client? 有人可以解释一下这个。/已经存在/.test(err?message) 方法吗? - Can someone explain this !/already exists/.test(err.message) method? err为空,但err.message存在于expressJS上 - err is blank but err.message exists on expressJS 当我在快速应用程序的错误处理程序中放入“ console.log(err.message)”时,它会不断记录日志,但是为什么呢? - when I put 'console.log(err.message)' in error handler of express app, It keeps logging endlessly but why? 如何使用 Node.js 中的请求库获取原始 HTTP 消息正文? - How can I get the raw HTTP message body using the request library in Node.js? 尝试与 React.js 应用程序同时运行我的 node.js 服务器并得到:'ERR_MODULE_NOT_FOUND' - Trying to run my node.js server at same time as React .js App and get: 'ERR_MODULE_NOT_FOUND' Node.js 如何在浏览器中使用警报消息 - Node.js how to use a alert message in the browser 在Node.js中,如何加载我的模块一次,然后在整个应用程序中使用它们? - In Node.js, how can I load my modules once and then use them throughout the app? 当所有参数都是可选参数时,如何在我的webservice GET方法中添加验证? - how can I add a validation to my webservice GET method in node.js when all parameters are optional? 每当在我的 Node.js API 中发出 GET 请求时,我如何发送随机集合? - How can i send a random collection whenever a GET request made in my Node.js API?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM