【问题标题】:Cannot read property 'map' of undefined Node js无法读取未定义节点 js 的属性“地图”
【发布时间】:2026-02-10 06:55:01
【问题描述】:

我收到错误消息,我正在编写一个函数来监视其路径。我是 Node.js 的新手:

TypeError: 无法读取未定义的属性“地图”

在 C:\Users\a\Desktop\DL\file\filemonitor.js:15:14 在 FSReqWrap.oncomplete (fs.js:149:20)

const Promise = require ('bluebird');
var fs = Promise.promisifyAll(require("fs"));

monitordir(monitorpath) {
  var fileList = [];
  return new Promise((resolve, reject) => {
    fs.readdir(monitorpath,function(err, items) {
      items.map((file) => {
        fileList.push(file);
      });
      resolve(fileList);
    });
  })
}

注意:我也没有看到package.json 文件。我是否应该成功运行才能看到它

【问题讨论】:

  • 那么,你会建议我需要做什么来纠正它。有人告诉我 Promise.promisifyAll 你添加了一个后缀 Aysnc,因此我添加了一个函数到 readdir

标签: javascript node.js fs


【解决方案1】:

当您运行var fs = Promise.promisifyAll(require("fs")); 时,它会向您返回一个承诺。所以你不能执行一个承诺的地图。

我相信你不需要 Promise 来解析 fs 模块,我的建议是你写这样的东西。

const Promise = require('bluebird');
const fs = require("fs");

const monitordir = path => {
    return new Promise((resolve, reject) => {
        fs.readdir(path, (error, items) => {
            if (error) return reject(error)
            return resolve(items);
        })
    })
}

【讨论】:

  • 所以我把我的代码改成了这个,我仍然得到同样的错误 const Promise = require('bluebird'); //var fs = Promise.promisifyAll(require("fs")); var fs = 需要('fs'); monitorDir(monitorPath) { var fileList = []; return new Promise((resolve, reject) => { fs.readdir(monitorPath, function(err, items) { items.map((file) =>{ fileList.push(file); }); resolve(fileList); }); }) }
  • 嘿伙计!我创建了一个要点来向您展示我是如何实现上面的代码的。 gist.github.com/nicolastakashi/7cb5cbea674a586f644ee561e96d3ac6希望对你有帮助
【解决方案2】:

尝试以下修复,看看它是否符合您的需求:

monitordir(monitorpath)
{
    var fileList = [];
    return fs.readdir(monitorpath)
        .then(function(err,items) {
            items.map((file) => {
                fileList.push(file); // fileList is ready here! do whatever you want before it resolves to caller
            });
            return fileList;
        })
        .catch(function(e) {
            // something bad happened; throw error or handle it as per your needs
            throw new Error(e);
        });
}

对于package.json,您可以在项目目录中运行npm init 命令,它会为您创建一个。

【讨论】:

  • 找到答案了,监视器路径设置不正确
  • 很好,但我仍然建议你尝试删除额外的 return new Promise((resolve,reject) => {,因为你有 promisifiedfs 模块,它看起来更干净更好,不需要额外的代码。
  • 谢谢 Zeeshan,会这样做的
最近更新 更多