【问题标题】:How do I correctly require files in NodeJS? [duplicate]如何在 NodeJS 中正确地要求文件? [复制]
【发布时间】:2019-09-07 12:55:08
【问题描述】:

我正在使用 NodeJS 和 ExpressJS 建立一个区块链客户端-服务器网络。我的服务器运行成功,区块链自行运行。但是我在将两者结合起来时遇到了一些问题。首先,这是我的项目结构:

node_p2p/
  node_modules/
    ...
  public/
    block.js
    client.js
    index.html
  package-lock.json
  package.json
  server.js

我遇到的实际问题是,我想在client.js 文件中包含block.js,但我总是在线得到ReferenceError: require is not defined,我将block.js 包含在client.js 中:

var block = require('./block.js');

我已经尝试了以下变体,但它们都产生了相同的错误(完全可以预料,因为 require 目录与调用 require 的文件相关,但我还是尝试了它们,以防万一):

var block = require('../public/block.js');
var block = require('../public/block');
var block = require('./public/block.js');
var block = require('./public/block');
var block = require('/public/block.js');
var block = require('/public/block');
var block = require('../block.js');
var block = require('../block');
var block = require('./block.js');
var block = require('./block');
var block = require('block.js');
var block = require('block');

这是block.js的代码:

const SHA256 = require ('crypto-js/sha256');

class Block{
   constructor(...){...}
   ...
}

class Blockhain{
   constructor(...){...}
   ...
}

module.exports = {
  Blockchain: function(){
    return new Blockchain();
  }
}

其次,client.js

var socket = io.connect('http://localhost:3000');
var block = require('./block.js');

socket.on('client', showData);
socket.on('clientno', showData);
socket.on('newclient', showData);
function showData(data) {
  console.log(data);
}

var nascoin = new block.Blockchain();

最后,server.js

var express = require('express');

var app = express();
var server = app.listen(3000);

app.use(express.static('public'));

console.log("server running!");

var socket = require('socket.io');
var io = socket(server);

io.sockets.on('connection', newConnection);

var client_counter = 0;

function newConnection(socket) {
  console.log('new conn: ' + socket.id);
  client_counter++;

  socket.emit('client', 'your client name: ' + socket.id);
  socket.emit('clientno', 'you are client no.: ' + client_counter);
  socket.broadcast.emit('newclient', 'new client has joined the fray');
  socket.on('server', function(data) {
    console.log(data);
  });
}

我什至不知道我还能做什么,要么我就是那么笨,要么就是那么盲目......

【问题讨论】:

  • 您的client.js 似乎在浏览器中运行,因此您可能需要查看import 或使用babel 之类的内容。 require() 是一个 NodeJS 函数,并不包含在所有 JS 环境中。

标签: javascript node.js express server blockchain


【解决方案1】:

你得到的错误,

ReferenceError: 要求未定义

与您尝试加载的实际模块不可用无关。这意味着函数 require 根本不可用,就像您要调用任何未定义的旧函数一样。

> require('./pkdxfjdghbdhfksdh')
Error: Cannot find module './pkdxfjdghbdhfksdh'

如果require 找不到模块,您将获得(在 Node 中)。

您究竟是如何运行此代码的?如果您实际上是在 Node 中运行它,例如node client.js,这个错误不应该发生。如果您尝试在浏览器中运行东西,您将需要像 Webpack 或 Parcel 这样的打包工具。

【讨论】:

  • 我正在使用node server.js 运行我的服务器,但public/client.js 包含在public/index.html 中,在我添加var block = require('./block.js'); 行之前它一直运行良好。跨度>
  • 对。 require 在浏览器中不存在——你需要一个捆绑器。 parceljs.org 可以说是最容易上手的。
【解决方案2】:

看来,您只是在浏览器中使用client.js,它附加到index.html。我建议您将client.js 代码与任何捆绑程序捆绑在一起,例如webpack。它将生成与浏览器兼容的代码,您可以在index.html 中使用。 浏览器没有require 内置实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2012-09-26
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2019-05-24
    • 2011-12-14
    相关资源
    最近更新 更多