简体   繁体   English

Node.js-TypeError:res.json不是一个函数(在某些路由中有效,而在其他路由中无效)

[英]Node.js - TypeError: res.json is not a function (working in some routes and not in others)

Working in the MERN stack (Mongo, Express, React, Node) and running into an error in my API. 在MERN堆栈(Mongo,Express,React,Node)中工作,并在我的API中遇到错误。

Here is my plaid.js file where one of my routes is throwing this error. 这是我的plaid.js文件,其中我的一条路由plaid.js此错误。 Of course, I've removed all of my secret token variables but assume everything works until the res.json error (which it does). 当然,我已经删除了所有秘密令牌变量,但假定一切正常,直到res.json错误(确实如此)。

        const express = require("express");
        const plaid = require("plaid");
        const router = express.Router();
        const jwt = require("jsonwebtoken");
        const keys = require("../../config/keys");
        const passport = require("passport");
        const moment = require("moment");
        const mongoose = require("mongoose");

        // Load Account and User models
        const Account = require("../../models/Account");
        const User = require("../../models/User");

        // Replaced my actual keys with empty strings for sake of this post
        const PLAID_CLIENT_ID = "";
        const PLAID_SECRET = "";
        const PLAID_PUBLIC_KEY = "";

        const client = new plaid.Client(
          PLAID_CLIENT_ID,
          PLAID_SECRET,
          PLAID_PUBLIC_KEY,
          plaid.environments.sandbox,
          { version: "2018-05-22" }
        );

        var PUBLIC_TOKEN = null;
        var ACCESS_TOKEN = null;
        var ITEM_ID = null;

        // @route POST api/plaid/accounts/add
        // @desc Trades public token for access token and stores credentials in database
        // @access Private
        router.post(
          "/accounts/add",
          passport.authenticate("jwt", { session: false }),
          (req, res) => {
            PUBLIC_TOKEN = req.body.public_token;

            const userId = req.user.id;
            const institution = req.body.metadata.institution;
            const { name, institution_id } = institution;

            if (PUBLIC_TOKEN) {
              client
                .exchangePublicToken(PUBLIC_TOKEN)
                .then(res => {
                  ACCESS_TOKEN = res.access_token;
                  ITEM_ID = res.item_id;

                  // Check if account already exists for specific user
                  Account.findOne({
                    userId: req.user.id,
                    institutionId: institution_id
                  })
                    .then(account => {
                      if (account) {
                        console.log("Account already exists");
                      } else {
                        const newAccount = new Account({
                          userId: userId,
                          publicToken: PUBLIC_TOKEN,
                          accessToken: ACCESS_TOKEN,
                          itemId: ITEM_ID,
                          institutionId: institution_id,
                          institutionName: name
                        });

                        // TO:DO fix error, res.json is not a function
                        newAccount.save().then(account => res.json(account));
                      }
                    })
                    .catch(err => console.log(err)); // Mongo Error
                })
                .catch(err => console.log(err)); // Plaid Error
            }
          }
        );
    module.exports = router;

The newAccount.save() executes just fine, but the subsequent res.json throws an error. newAccount.save()执行得很好,但是随后的res.json抛出错误。 This is the error that I am getting returned. 这是我得到返回的错误。 Namely, res.json is not a function . 即, res.json is not a function

[0] (node:23413) UnhandledPromiseRejectionWarning: TypeError: res.json is not a function
[0]     at newAccount.save.then.account (/Users/rishi/plaid-auth/routes/api/plaid.js:97:55)
[0]     at process._tickCallback (internal/process/next_tick.js:68:7)

There are quite a few posts on here with the res.json is not a function error, but none of the proposed solutions worked for me. res.json is not a function上有很多帖子res.json is not a function错误,但是没有提出的解决方案对我res.json is not a function I am quite confused why this error is being thrown since I use the same convention in another part of the app and res.json works just fine. 我很困惑为什么会引发此错误,因为我在应用程序的另一部分中使用了相同的约定,并且res.json正常工作。 See the below example of where res.json works. 请参见下面的res.json工作位置res.json

// @route POST api/posts
// @desc Create a post
// @access Private
router.post(
  "/",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    const { errors, isValid } = validatePostInput(req.body);

    // Check validation
    if (!isValid) {
      return res.status(400).json(errors);
    }

    const newPost = new Post({
      text: req.body.text,
      name: req.body.name,
      avatar: req.body.avatar,
      user: req.user.id // current logged in user
    });

    // res.json works just fine
    newPost.save().then(post => res.json(post));
  }
);

It's because this piece of code 这是因为这段代码

if (PUBLIC_TOKEN) {
          client
            .exchangePublicToken(PUBLIC_TOKEN)
            .then(res => {
              ACCESS_TOKEN = res.access_token;

When you get to execute this line newAccount.save().then(account => res.json(account)); 当您执行此行时, newAccount.save().then(account => res.json(account)); the res is not longer the one on the function router.post('/accounts/add', (req, res) => {}) res不再是功能router.post('/accounts/add', (req, res) => {})

So, the solution is simple, change the res from the promise exchangePublicToken into something else like the example below. 因此,解决方案很简单,将资源从promise exchangePublicToken更改为其他示例,例如下面的示例。

You are naming the parameter from the promise callback the same as the parameter on the callback from the router.post above 您正在将promise回调中的参数命名为与router.post上的回调中的参数相同

if (PUBLIC_TOKEN) {
          client
            .exchangePublicToken(PUBLIC_TOKEN)
            .then(exchangeResponse => {
              ACCESS_TOKEN = exchangeResponse.access_token;

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM