【问题标题】:Mongoose Unexpected token u in JSON at position 0位置 0 处 JSON 中的 Mongoose 意外标记 u
【发布时间】:2020-05-23 10:10:03
【问题描述】:

我正在使用 Node JS 创建一个 AWS Lambda API。数据库连接本身有一个模板,但是当我在 Lambda 中运行测试时出现错误,我认为问题出在连接本身。

这是我在使用 Lambda 测试时收到的错误消息:

START RequestId:6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 版本:$LATEST 2020-05-23T01:46:23.685Z 6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 INFO => 使用新的数据库连接 2020-05-23T01:46:23.689Z 6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 错误(节点:8) 弃用警告:当前 URL 字符串解析器已弃用,并将在未来版本中删除。要使用新的解析器,请将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。 2020-05-23T01:46:23.726Z 6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 错误(节点:8) 弃用警告:当前的服务器发现和监控引擎已弃用,并将在未来版本中删除。要使用新的服务器发现和监控引擎,请将选项 { useUnifiedTopology: true } 传递给 MongoClient 构造函数。 2020-05-23T01:46:23.828Z 6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 错误未处理的承诺拒绝 {“errorType”:“Runtime.UnhandledPromiseRejection”,“errorMessage”:“SyntaxError:JSON 中位置 0 的意外标记 u” ,"reason":{"errorType":"SyntaxError","errorMessage":"JSON 中位置 0 的意外标记 u","stack":["SyntaxError: JSON 中位置 0 的意外标记 u"," 在 JSON .parse ()"," 在 /var/task/handler.js:17:22"," 在 processTicksAndRejections (internal/process/task_queues.js:97:5)"]},"promise":{},"堆栈“:[“Runtime.UnhandledPromiseRejection:SyntaxError:JSON中位置0处的意外标记u”,“在进程。(/var/runtime/index.js:35:15)”,“在process.emit(events.js :310:20)"," 在 processPromiseRejections (internal/process/promises.js:209:33)"," 在 processTicksAndRejections (internal/process/task_queues.js:98:32)"]} 结束请求 ID:6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 报告请求 ID:6b9eef97-9c54-44bc-8ecc-dfbec7e200e5 持续时间:186.61 毫秒计费持续时间:200 毫秒内存大小:1024 MB 使用的最大内存:34 MB
发生未知的应用程序错误

DB.js

const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
let isConnected;

module.exports = connectToDatabase = () => {
  if (isConnected) {
    console.log("=> using existing database connection");
    return Promise.resolve();
  }

  console.log("=> using new database connection");
  return mongoose.connect(process.env.DB).then((db) => {
    isConnected = db.connections[0].readyState;
  });
};

Handler.js

"use strict";

const connectToDatabase = require("./db");
const Lead = require("./leads.model.js");

require("dotenv").config({ path: "./variables.env" });

module.exports.hello = (event, context, callback) => {
  console.log("Hello World");
  callback(null, "Hello World");
};

module.exports.create = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;

  connectToDatabase().then(() => {
    Lead.create(JSON.parse(event.body))
      .then((lead) =>
        callback(null, {
          statusCode: 200,
          body: JSON.stringify(lead),
        })
      )
      .catch((err) =>
        callback(null, {
          statusCode: err.statusCode || 500,
          headers: { "Content-Type": "text/plain" },
          body: "Could not create the lead.",
        })
      );
  });
};

variables.env

DB=mongodb+srv://dbUser:password@api-jodqc.mongodb.net/test?retryWrites=true&w=majority

【问题讨论】:

  • 这通常意味着你试图解析的是undefined。由于我只在一处看到JSON.parse(),我猜event.bodyundefined

标签: node.js mongodb aws-lambda


【解决方案1】:

每当我看到Unexpected token u in JSON at position 0 时,通常意味着JSON.parse 正在尝试解析undefined。查看代码,我只看到你在一个地方执行 parse

Lead.create(JSON.parse(event.body))

我猜当您执行 Lambda 时,您会直接传入一个看起来像潜在客户的对象,所以可能如下所示。

{
  isALead: true
}

相反,您需要使用看起来像的对象进行测试

{
  body: "{ \"isALead\": true }"
}

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2019-08-30
    • 2018-01-29
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多