【问题标题】:VS Code - TypeError: Cannot read property 'toUpperCase' of undefinedVS Code - TypeError:无法读取未定义的属性“toUpperCase”
【发布时间】:2020-08-27 05:05:53
【问题描述】:

当我在 VSCode 上使用 js 修改 if 语句时出现 TypeError。

在我添加 .toUpperCase() 方法之前,以下 if 语句有效:

`ourApp.post('/answer', function(req, res) {
    if (req.body.skyColor.toUpperCase() == "BLUE") {
        res.send(
        <p>Congrats, that is the correct answer!</p>
        <a href="/">Back to homepage</a>
        )`

**请注意,我确实在需要的地方有模板文字,但它们与上述格式混淆,所以我不得不删除它们。

但是在我添加了上面的 .toUpperCase() 方法之后,我得到了下面的 TypeError:

TypeError:无法读取未定义的属性“toUpperCase” 在 /home/ryan/JavaScript/test.js:16:27 在 Layer.handle [as handle_request] (/home/ryan/JavaScript/node_modules/express/lib/router/layer.js:95:5) 在下一个(/home/ryan/JavaScript/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/home/ryan/JavaScript/node_modules/express/lib/router/route.js:112:3) 在 Layer.handle [as handle_request] (/home/ryan/JavaScript/node_modules/express/lib/router/layer.js:95:5) 在 /home/ryan/JavaScript/node_modules/express/lib/router/index.js:281:22 在 Function.process_params (/home/ryan/JavaScript/node_modules/express/lib/router/index.js:335:12) 在下一个(/home/ryan/JavaScript/node_modules/express/lib/router/index.js:275:10) 在 /home/ryan/JavaScript/node_modules/body-parser/lib/read.js:130:5 在invokeCallback (/home/ryan/JavaScript/node_modules/raw-body/index.js:224:16)

我认为我的 express 安装有问题?不过,我在工作文件夹中安装了 package.json 文件和所有文件,所以我不确定哪里可能存在损坏的文件或任何东西。

有什么想法吗?

【问题讨论】:

  • 您是否在请求正文中传递了skyColor
  • 嘿,你确定skyColor 在请求正文中吗?检查拼写和大小写。
  • ourApp.get('/', function(req, res) { res.send(`

    天空是什么颜色在晴朗晴朗的日子?

    `) })

标签: javascript express visual-studio-code typeerror


【解决方案1】:

Express 默认不解析正文。它仅作为 Stream 提供。

我为您看到的最佳解决方案是在端点之前使用 json() 中间件。

尝试添加:

// parse application/json
app.use(express.json())

// Your endpoint here

app.use() 函数意味着你收到的每个请求都会经过指定的方法,在这种情况下它会将请求的正文解析到req.body 字段中。

这假定将使用正确的标头 (Content-Type: "application/json") 调用您的端点,并且您确实发送了格式正确的 Json 正文。

检查正文的内容是否符合您的预期是个好主意,此断言将防止您的代码出现许多错误和崩溃。

为此,Npm 上有许多用于模式验证的库,只需选择最适合您的。

【讨论】:

  • 当我包含它时,当我尝试在节点中运行它时得到“ReferenceError: app is not defined”
  • express.json() 是内置中间件,无需使用外部正文解析器。 expressjs.com/en/api.html#express.json
  • 瑞恩,在你的情况下是ourApp
【解决方案2】:

从您的 cmets 看来,您的传入请求似乎来自 &lt;form&gt;

而且,在其默认配置中,Express 不会自动为您读取和解析任何 POST 或 PUT 请求的正文。相反,您需要安装正确的中间件来为您读取和解析正文。在您的情况下,来自浏览器的传入&lt;form&gt; 通常是application/x-www-form-urlencoded MIME 类型。要解析它,您将添加以下行:

app.use(express.urlencoded({extended:true}))

在您的 app.post() 处理程序之前的某个时间点。您可以查看此here 的快速文档。该中间件将检查主体的 mime 类型,如果它是表单通常设置的上述类型,那么它将读取传入请求的主体并对其进行解析并将结果放入 req.body 以便您的请求处理程序可以然后访问req.body中的数据。

如果在安装此中间件后,它仍然无法正常工作,那么我们需要更多地了解传入的 http 请求中的确切内容,以便我们可以准确查看正文中的内容。假设这是来自浏览器,您可以进入 Chrome 调试器(在页面中右键单击并单击“检查”,然后在任何浏览器操作导致其将数据发送到服务器之前转到网络选项卡。然后,通过查看网络选项卡中屏幕左侧的列表,您可以找到对您服务器的特定请求,单击它,然后右侧窗格将显示请求的详细信息。

【讨论】:

    【解决方案3】:

    现在可以了,我相信我知道为什么了:

    我退出 VS Code 并重新启动它大约 3-4 次。上次,我在我的目录中查找了工作文件夹并将其打开(右键单击“使用代码打开”)。现在一切正常。

    我确定我已经在 VSC 中的那个文件夹中工作了,所以我有点困惑到底发生了什么变化,但它可以工作......所以¯_(ツ)_/¯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2018-05-13
      • 2019-12-08
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多