JavaScript:有人能让它工作或者解释为什么它不工作吗';T

JavaScript:有人能让它工作或者解释为什么它不工作吗';T,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,更新 根据epiqueras的回答,我查看了如何处理导入。首先,/models/index.js正在导出命名导出。代码如下: 'use strict'; import { readdirSync } from 'fs' import { basename, extname, resolve } from 'path'; // // Using module.exports here as a bit of a hack // to allow for member

更新

根据epiqueras的回答,我查看了如何处理导入。首先,
/models/index.js
正在导出命名导出。代码如下:

'use strict';

import { readdirSync } from 'fs'
import {
    basename,
    extname,
    resolve
} from 'path';


//
// Using module.exports here as a bit of a hack 
// to allow for member imports in the form of
// import { Constructor } from "~/models"
module.exports = readdirSync(__dirname)             // Get contents of current directory
                   .filter(f => f !== 'index.js')   // Exclude the index file
                   .map(f => resolve(__dirname, f)) // Resolve the complete module file path
                   .map(f => require(f).default)    // Require the module
                   .reduce((prev, next) => {        // Reduce the array of modules to a hash of Module.name = Module
                       prev[next.name] = next;
                       return prev;
                    }, {});
我从一个不适合我的项目中得到了这个结果(毫无疑问是用户错误)。我后来发现,如果我直接导入类,即,
从“../models/Patron”导入Patron
,那么一切都会按预期进行

在这一点上,我的项目中还有五个其他模型,它们都可以使用上面的代码很好地导出<代码>用户是唯一没有的用户。如原问题所述,如果我将名称更改为其他名称,上面的代码将导出新名称,而不会出现任何问题

谢天谢地,我现在有了解决办法。希望我能弄明白为什么它会被这个名字
顾客
噎住

原始问题

我用JavaScript编写了一个简单的类:

'use strict'

export default class Patron {
  constructor(props) {
    this.props = props;
  }

  create() {
    // In my actual code I make a network call,
    // simplified this just to see if anyone can get it to return a promise
    return Promise.resolve(this);
  }
}
为了完整起见,下面是我如何使用构造函数的示例:

'use strict'

import { Router } from 'express';
import { Patron } from '../models';

const PatronRouter = Router();

PatronRouter.post('/patrons', (req, res) => {
  let patron = new Patron({ name: 'John Doe' });
  let promise = patron.create().then(response => res.send(response);
}

export PatronRouter;
以下是我的经验:

  • 用户
    是有效的构造函数,初始化实例时没有错误
  • 用户
    用户
  • 用户道具
    未定义
  • patron.create
    作为实例方法存在
  • 用户创建
    返回
    未定义
这里有一点对我来说绝对没有意义:如果我更改了类的名称,一切都正常。我不明白
用户的名称在哪里/如何/为什么会导致问题

还有几点需要注意:

  • 运行节点(6.9.2)
  • 作为Express(最新)应用程序的一部分,试图从
    路由器执行此代码
  • 在启用
    es2015
    预设的情况下使用Babel 6

想法?

您将类导出为默认导出,但将其导入为命名导出

尝试以下操作:
从“../models
导入用户


或者将导出更改为命名导出:
导出类用户

您可以显示物品的导入端吗?您是否有任何其他
用户
符号?您是否查看了Babel生成的代码以查看生成的代码的确切外观?您的代码似乎有效,但您的表达是错误的:
patron.props=defined
patron.create=>Promise.
。请注意,如果您使用ajax调用,则不应返回
Promise.resolve()
,而应实际将该调用包装为
新承诺((接受,拒绝)=>{your code here})
@jfriend00扩展了导入/使用示例。我在任何地方都没有找到任何其他
用户
符号,我也不完全确定我是否知道如何查看巴贝尔生成的代码。此时,我正在通过
npm start
学习/调试,启动脚本为
nodemon index.js--exec babel node
调用
new-Patron
不太可能成功,因为
Patron
作为默认导出导出,但作为命名导出导入,这意味着它可能是未定义的。@jfriend00它并不能解决我的问题,但它确实确认了命名一个类
用户
并不是一个普遍的错误。我仍然无法理解为什么它会在我的项目中失败。@sellmeadog-您可以放心,
Patron
在Javascript中不是保留字,也不是node.js中的预定义符号。我猜您自己的代码或正在导入的某些代码中有另一个符号冲突。@Epiquer根据我对原始问题的更新,您的回答帮助我找到了解决问题的方法,这就是我接受它的原因。仍然很好奇为什么我的
models/index.js
会被
Patron
阻塞,但我可以稍后再弄清楚。@sellmeadog您是否尝试过console.logging您的reduce代码?我认为,当您更改它的名称时,它工作的原因与models目录中文件的字典顺序有关。用户被放入该数组的顺序可能会导致它失败。在readDirSync、filter、map、map和reduce之后记录,并查看如何处理用户。