- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 ErikRas 的启动程序在 React、Redux、Express 和 Socket io 中构建一个网站:https://github.com/erikras/react-redux-universal-hot-example
我觉得很疯狂:这么多关于 React 和 Redux 的教程。不想说如何实现 MongoDb。我希望答案对其他人也有用。事实上,我们在网上可以找到的所有启动器都避免谈论和举例说明数据存储。 ...也许是因为它把复杂性推得太远了。我不知道。所以...我正在尝试添加 MongoDb。这些教程展示了不同的方式,但始终使用纯 node.js 和 express,并且通常具有极其简单的设置。但是 starter 的 api 一点也不简单,我迷路了!我不知道我是否必须将它们全部连接到 api.js 或 server.js 或......我非常困惑!!!
我设置了 MongoDb,它工作正常。我已经通过终端在其中收取了一些数据。然后,在 api.js 中我添加了一些行(在以下代码中注释):
import express from 'express';
import session from 'express-session';
import bodyParser from 'body-parser';
import config from '../src/config';
import * as actions from './actions/index';
import {mapUrl} from 'utils/url.js';
import PrettyError from 'pretty-error';
import http from 'http';
import SocketIo from 'socket.io';
// --------------- New Code
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest1');
// --------------------------------------
const pretty = new PrettyError();
const app = express();
const server = new http.Server(app);
const io = new SocketIo(server);
io.path('/ws');
app.use(session({
secret: 'react and redux rule!!!!',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 60000 }
}));
app.use(bodyParser.json());
app.use((req, res) => {
const splittedUrlPath = req.url.split('?')[0].split('/').slice(1);
const {action, params} = mapUrl(actions, splittedUrlPath);
if (action) {
action(req, params)
.then((result) => {
if (result instanceof Function) {
result(res);
} else {
res.json(result);
}
}, (reason) => {
if (reason && reason.redirect) {
res.redirect(reason.redirect);
} else {
console.error('API ERROR:', pretty.render(reason));
res.status(reason.status || 500).json(reason);
}
});
} else {
res.status(404).end('NOT FOUND');
}
});
// -------------------> New code -> 'II part'
app.use(function(req,res,next){
req.db = db;
next();
});
// --------------------------------
const bufferSize = 100;
const messageBuffer = new Array(bufferSize);
let messageIndex = 0;
if (config.apiPort) {
const runnable = app.listen(config.apiPort, (err) => {
if (err) {
console.error(err);
}
console.info('----\n==> 🌎 API is running on port %s', config.apiPort);
console.info('==> 💻 Send requests to http://%s:%s', config.apiHost, config.apiPort);
});
io.on('connection', (socket) => {
socket.emit('news', {msg: `'Hello World!' from server`});
socket.on('history', () => {
for (let index = 0; index < bufferSize; index++) {
const msgNo = (messageIndex + index) % bufferSize;
const msg = messageBuffer[msgNo];
if (msg) {
socket.emit('msg', msg);
}
}
});
socket.on('msg', (data) => {
data.id = messageIndex;
messageBuffer[messageIndex % bufferSize] = data;
messageIndex++;
io.emit('msg', data);
});
});
io.listen(runnable);
} else {
console.error('==> ERROR: No PORT environment variable has been specified');
}
...但这会立即在终端中显示一个错误:
proxy error { Error: connect ECONNREFUSED 127.0.0.1:3030
at Object.exports._errnoException (until.js953:11)
at exports._exceptionWithHostPort (until.js:976:20)
at TCPConnectWrap.afterConnect [as oncomplete ] (net.js:1080:14)
code: 'ECONNREFUSED'
errno: 'ECONNREFUSED'
syscall: 'connect'
address: '127.0.0.1'
port: 3030 }
我必须在哪里以及如何实现 MongoDb?为什么即使我添加的代码的第二部分不存在,我也会收到错误消息?有有用文档的链接吗?
提前致谢!
最佳答案
所以,我在这里提出了一个解决方案。我会尽量留下我想找到的答案。
目前,我只是实现了写入Mongo数据库。但是还有很多工作要做。而且我不确定我使用它的方式是否最适合性能。所以请随意改进它并开发一个完整的答案。
所以,这里是我如何将 MongoDb 与 express 和 socket.io 结合使用。我正在根据 Erik Ras 的样板构建我的网站
https://github.com/erikras/react-redux-universal-hot-example
在您的计算机上安装 MongoDb。它将在 C:\中安装 Mongo 我做了两次,第二次是在 Porgrams 中安装。
在名为 api 的文件夹中创建一个名为“data”的新文件夹。
然后使用终端在 MongoDb 文件夹内导航并找到 bin。从那里,数字数据文件夹的路径:
mongod --dbpath c:\nameofthefolderproject\api\data
Mongo 初始化数据存储(需要一点时间),启动并等待连接。
使用项目根目录中的终端导航并安装 mongoose:
npm install mongoose
然后打开文件nameofthefolderproject\api\api.js里面有import mongoose:
import mongoose from 'mongoose';
并在导入后立即添加:
var mongoURI = "mongodb://localhost/nameofyourproject";
var db = mongoose.connect(mongoURI, function(err){
if(err){
console.log(err);
}else{
console.log('Finally connected!!!');
}
});
您应该在终端中收到消息。
在 api 文件夹中创建一个名为:nameofthefolderproject\api\models 的文件夹
在里面创建文件nameofthefolderproject\api\models\members.js
创建 Mongoose 模式。不懂就看文档吧。
var mongoose = require(' Mongoose ');
var membersSchema = mongoose.Schema({
pseudo:{
type: String,
required: true
},
email:{
type: String,
required: true
},
date:{
type: Date,
default: Date.now
}
});
var Members = module.exports = mongoose.model('members', membersSchema);
创建文件:nameofthefolderproject\api\models\index.js 并写入以下内容。在这里,您将收集所有导出随时可用的模型。
export members from './members';
当 api 调用操作时,将模型传递给函数。
app.use(bodyParser.json());
app.use((req, res) => {
const splittedUrlPath = req.url.split('?')[0].split('/').slice(1);
const {action, params} = mapUrl(actions, splittedUrlPath);
// it calls the right action passing also the mongoose schemas (models)
if (action) {
action(req, params, models) etc etc...
现在进入服务器调用的 Action 。在我的例子中:nameofthefolderproject\api\actions\addMember 您现在可以使用该模型进行注册。就我而言:
export default function addMember(req, err, models) {
// this is the function called by the api. I passed all the models of mongoose.
return new Promise((resolve, reject) => {
// charge the data received from the form in a variable
var data = req.body;
// extract the mongoose model I interested about.
var Members = models.members;
// initialise the mongoose schema and connect the data received to the schema
var newMember = new Members({pseudo:data.pseudo, email:data.email});
// In this way I can register the data in mongodb data store
newMember.save(function(err, data){
// verify if there is an error, and confirm eventually the success
if(err){
throw err;
reject();
}
resolve();
});
});
}
如果我接下来几天有时间,我会开发其余部分并发布。
享受吧。
最大
关于node.js - 如何用mongoDb实现Express?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426066/
我是一名优秀的程序员,十分优秀!