- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我没有使用 NodJ 的经验。我正在尝试使用 node 命令从命令提示符运行 app.js 文件,但收到此错误
D:\Imports\sparkleshare-dashboard\node_modules\connect-redis\lib\connect-redis.j
s:96
RedisStore.prototype.__proto__ = Store.prototype;
^
TypeError: Cannot read property 'prototype' of undefined
at module.exports (D:\Imports\sparkleshare-dashboard\node_modules\connect-re
dis\lib\connect-redis.js:96:41)
at Object.<anonymous> (D:\Imports\sparkleshare-dashboard\app.js:12:42)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:902:3
这是我的 app.js 文件
/**
* Module dependencies.
*/
var express = require('express');
var querystring = require('querystring');
var i18n = require("i18n");
var config = require('./config');
var errors = require('./error');
var utils = require('./utils');
var RedisStore = require('connect-redis')(express);
var redis = require('redis'), redisClient = redis.createClient();
var app = null;
if (config.https.enabled) {
var fs = require("fs");
var privateKey = fs.readFileSync(config.https.key);
var certificate = fs.readFileSync(config.https.cert);
app = module.exports = express.createServer({ key: privateKey, cert: certificate });
} else {
app = module.exports = express.createServer();
}
var session = express.session({ secret: config.sessionSecret, store: new RedisStore() });
i18n.configure({
locales: ['en', 'cs', 'de', 'el']
});
// Configuration
app.configure(function(){
var lf = utils.getLoggingFormat();
if (lf) {
app.use(express.logger(lf));
}
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('basepath', config.basepath);
app.use(function(req, res, next) {
if ('x-forwarded-proto' in req.headers && req.headers['x-forwarded-proto'] == 'https') {
req.connection.encrypted = true;
}
next();
});
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.compiler({ src: __dirname + '/public', enable: ['sass'] }));
app.use(express.static(__dirname + '/public'));
app.use(i18n.init);
app.use(app.router);
});
var FolderProvider = require('./folderProvider').FolderProvider;
var folderProvider = new FolderProvider(config.folders);
var DeviceProvider = require('./deviceProvider').DeviceProvider;
var deviceProvider = new DeviceProvider(redisClient);
var UserProvider = require('./userProvider').UserProvider;
var userProvider = new UserProvider(redisClient, deviceProvider);
var LinkCodeProvider = require('./linkCodeProvider').LinkCodeProvider;
var linkCodeProvider = new LinkCodeProvider();
var middleware = require('./middleware');
middleware.setup(userProvider, deviceProvider, folderProvider, linkCodeProvider);
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(errors.errorHandler);
app.use(express.errorHandler());
});
function auth(login, pass, next) {
userProvider.findByLogin(login, function(error, user) {
if (!user) {
return next(new Error('Invalid login'));
}
if (user.checkPassword(pass)) {
return next(null, user);
} else {
return next(new Error('Invalid login'));
}
});
}
// Dynamic helpers
app.dynamicHelpers({
messages: require('express-messages'),
user: function(req, res) {
return req.currentUser;
},
basepath: function() {
return this.set('basepath');
}
});
app.helpers({
convertSize: function(bytes) {
var unit = 0;
while (unit < 3 && bytes >= 1024) {
unit++;
bytes /= 1024;
}
return (Math.round(bytes * 100, 2) / 100).toString() + " " + ["", "Ki", "Mi", "Gi"][unit] + "B";
},
__i: i18n.__,
__n: i18n.__n
});
// Routes
app.all(/^(?!\/api\/).+/, function(req, res, next) {
session(req, res, next);
});
require('./api')(app, deviceProvider, folderProvider, middleware);
app.get('/', function(req, res){
res.redirect('/login');
});
app.get('/logout', function(req, res){
req.session.destroy(function(){
res.redirect('home');
});
});
app.get('/login', function(req, res){
userProvider.getUserCount(function(error, count) {
if (count < 1) {
res.redirect('/createFirstUser');
} else {
if (req.session.user) {
res.redirect('/folder');
} else {
res.render('login');
}
}
});
});
app.get('/createFirstUser', middleware.userDbEmpty, function(req, res) {
res.render('createFirstUser', { formval: {} });
});
app.post('/createFirstUser', middleware.userDbEmpty, function(req, res) {
var reRenderForm = function() {
res.render('createFirstUser', {
formval: req.body
});
};
if (!req.body.passwd1) {
req.flash('error', i18n.__('Password could not be empty'));
return reRenderForm();
}
if (req.body.passwd1 != req.body.passwd2) {
req.flash('error', i18n.__('Passwords must match'));
return reRenderForm();
}
userProvider.createNew(req.body.login, req.body.realname, req.body.passwd1, true, [], function(error, user) {
if (error) {
req.flash('error', error);
reRenderForm();
} else {
res.redirect('/login');
}
});
});
app.post('/login', function(req, res){
auth(req.body.login, req.body.password, function(error, user) {
if (error) {
req.flash('error', error);
res.render('login');
} else {
if (user) {
req.session.regenerate(function(){
req.session.user = user;
res.redirect('back');
});
} else {
req.flash('error', error);
res.render('login');
}
}
});
});
app.get('/changeProfile', middleware.isLogged, function(req, res) {
res.render('changeProfile', {
formval: req.currentUser
});
});
app.post('/changeProfile', middleware.isLogged, function(req, res, next) {
var reRenderForm = function() {
res.render('changeProfile', {
formval: req.body
});
};
var updatePassword = false;
if (req.body.new1) {
if (req.body.new1 != req.body.new2) {
req.flash('error', i18n.__('Passwords must match'));
return reRenderForm();
}
updatePassword = true;
}
var user = req.currentUser;
if (updatePassword) {
user.setPassword(req.body.new1);
req.flash('info', i18n.__('Password updated'));
}
user.name = req.body.name;
userProvider.updateUser(user, function(error) {
req.flash('info', i18n.__('Profile updated'));
res.redirect('back');
});
});
app.get('/manageUsers', [middleware.isLogged, middleware.isAdmin], function(req, res, next) {
userProvider.findAll(function(error, u) {
if (error) { return next(error); }
res.render('manageUsers', {
users: u
});
});
});
app.get('/modifyUser/:uid', [middleware.isLogged, middleware.isAdmin, middleware.loadUser], function(req, res, next) {
folderProvider.findAll(function(error, folders) {
if (error) { return next(error); }
res.render('modifyUser', {
u: req.loadedUser,
folders: folders
});
});
});
app.post('/modifyUser/:uid', [middleware.isLogged, middleware.isAdmin, middleware.loadUser], function(req, res, next) {
folderProvider.findAll(function(error, folders) {
if (error) { return next(error); }
var u = req.loadedUser;
u.name = req.body.name;
u.admin = req.body.admin == 't' ? true : false;
u.acl = req.body.acl ? req.body.acl : [];
userProvider.updateUser(u, function(error) {
req.flash('info', i18n.__('User updated'));
res.redirect('back');
});
});
});
app.get('/deleteUser/:uid', [middleware.isLogged, middleware.isAdmin, middleware.loadUser], function(req, res, next) {
res.render('deleteUser', {
u: req.loadedUser
});
});
app.post('/deleteUser/:uid', [middleware.isLogged, middleware.isAdmin, middleware.loadUser], function(req, res, next) {
var reRenderForm = function() {
res.render('deleteUser', {
u: req.body
});
};
var u = req.loadedUser;
userProvider.deleteUser(u.uid, function(error) {
if (error) {
req.flash('error', error.message);
reRenderForm();
} else {
req.flash('info', i18n.__('User deleted'));
res.redirect('/manageUsers');
}
});
});
app.get('/createUser', [middleware.isLogged, middleware.isAdmin], function(req, res) {
res.render('createUser', { formval: {} });
});
app.post('/createUser', [middleware.isLogged, middleware.isAdmin], function(req, res) {
var reRenderForm = function() {
res.render('createUser', {
formval: req.body
});
};
if (!req.body.passwd1) {
req.flash('error', i18n.__('Password could not be empty'));
return reRenderForm();
}
if (req.body.passwd1 != req.body.passwd2) {
req.flash('error', i18n.__('Passwords must match'));
return reRenderForm();
}
userProvider.createNew(req.body.login, req.body.realname, req.body.passwd1, req.body.admin == 't', [], function(error, user) {
if (error) {
req.flash('error', error);
reRenderForm();
} else {
req.flash('info', i18n.__('User created'));
res.redirect('/manageUsers');
}
});
});
app.get('/publicFolder/:folderId', function(req, res, next) {
folderProvider.findById(req.params.folderId, function(error, folder) {
if (!folder.pub) {
next(new errors.Permission('This is not a public folder'));
} else {
var filename = req.param('name');
if (!filename) {
filename = 'file';
}
res.attachment(filename);
folder.getRawData(req,
function(error, data) {
if (error) { return next(error); }
res.write(data);
},
function(error, data) {
if (error) { return next(error); }
res.end();
}
);
}
});
});
app.get('/recentchanges/:folderId?', middleware.isLogged, middleware.checkFolderAcl, function(req, res, next) {
folderProvider.findById(req.params.folderId, function(error, folder) {
if (error) { return next(error); }
folder.getRecentChanges(req, function(error, data) {
if (error) { return next(error); }
res.render('recentchanges', {
data: data,
folder: folder
});
});
});
});
app.get('/folder/:folderId?', middleware.isLogged, middleware.checkFolderAcl, function(req, res, next) {
if (!req.params.folderId) {
folderProvider.findAll(function(error, folders){
if (error) { return next(error); }
utils.aclFilterFolderList(folders, req.currentUser);
res.render('folders', {
folders: folders
});
});
} else {
folderProvider.findById(req.params.folderId, function(error, folder) {
if (error) { return next(error); }
if (req.param('type') == 'file') {
var filename = req.param('name');
if (!filename) {
filename = 'file';
}
res.attachment(filename);
folder.getRawData(req,
function(error, data) {
if (error) { return next(error); }
res.write(data);
},
function(error, data) {
if (error) { return next(error); }
res.end();
}
);
} else {
folder.getItems(req, function(error, list) {
if (error) { return next(error); }
var curPath = req.param('path');
var parUrl = null;
if (curPath) {
var parPath = curPath.split('/');
parPath.pop();
parPath = parPath.join('/');
parUrl = querystring.stringify({
path: parPath
});
}
res.render('folder', {
folder: folder,
tree: list,
path: curPath,
parUrl: parUrl
});
});
}
});
}
});
app.get('/download/:folderId', middleware.isLogged, middleware.checkFolderAcl, function(req, res, next) {
folderProvider.findById(req.params.folderId, function(error, folder) {
if (error) { return next(error); }
var headersSent = false;
var maybeSentHeaders = function() {
if (headersSent) {
return;
}
headersSent = true;
var filename = 'archive';
var path = req.param('path');
if (path && path != '') {
filename += '-' + path.replace(/[^\w\d-]/, '_');
}
filename += '-' + req.params.folderId.substring(0, 8) + '.zip';
res.writeHead(200, {
'Content-Type': 'application/zip',
'Content-Disposition': 'attachment; filename="' + filename + '"'
});
};
folder.createArchive(req, function(error, data) {
if (error) { return next(error); }
maybeSentHeaders();
res.write(data);
},
function(error, data) {
if (error) { return next(error); }
maybeSentHeaders();
res.end();
}
);
});
});
app.get('/linkedDevices', middleware.isLogged, function(req, res, next) {
if (req.currentUser.admin) {
deviceProvider.findAll(function(error, devices) {
if (error) { return next(error); }
r = function(logins) {
res.render('linkedDevices', {
devices: devices,
logins: logins
});
};
var logins = {};
userProvider.findAll(function(error, users) {
var count = users.length;
if (count === 0) {
r(logins);
}
users.forEach(function(user) {
logins[user.uid] = user.login;
if (--count === 0) {
r(logins);
}
});
});
});
} else {
deviceProvider.findByUserId(req.currentUser.uid, function(error, devices) {
if (error) { return next(error); }
res.render('linkedDevices', {
devices: devices
});
});
}
});
app.get('/linkDevice', middleware.isLogged, function(req, res) {
var schema = config.https.enabled ? 'https' : 'http';
var url = schema + '://' + req.header('host');
if (config.externalUrl) {
url = config.externalUrl;
}
res.render('linkDevice', {
url: url
});
});
app.get('/unlinkDevice/:did', [middleware.isLogged, middleware.loadDevice, middleware.owningDevice], function(req, res, next) {
res.render('unlinkDevice', {
d: req.loadedDevice
});
});
app.post('/unlinkDevice/:did', [middleware.isLogged, middleware.loadDevice, middleware.owningDevice], function(req, res, next) {
var d = req.loadedDevice;
deviceProvider.unlinkDevice(d.id, function(error) {
if (error) {
req.flash('error', error.message);
res.render('unlinkDevice', {
d: req.loadedDevice
});
} else {
req.flash('info', i18n.__('Device unlinked'));
res.redirect('/linkedDevices');
}
});
});
app.get('/modifyDevice/:did', [middleware.isLogged, middleware.loadDevice, middleware.owningDevice], function(req, res, next) {
res.render('modifyDevice', {
d: req.loadedDevice
});
});
app.post('/modifyDevice/:did', [middleware.isLogged, middleware.loadDevice, middleware.owningDevice], function(req, res, next) {
var d = req.loadedDevice;
d.name = req.body.name;
deviceProvider.updateDevice(d, function(error) {
req.flash('info', i18n.__('Device updated'));
res.redirect('back');
});
});
app.get('/getLinkCode', middleware.isLogged, function(req, res) {
var code = linkCodeProvider.getNewCode(req.currentUser.uid);
var schema = config.https.enabled ? 'https' : 'http';
code.url = schema + '://' + req.header('host');
if (config.externalUrl) {
code.url = config.externalUrl;
}
res.contentType('application/json');
res.send(code);
});
// always keep this as last route
app.get('/stylesheets', function(req, res, next) {
next();
});
app.get('*', function(req, res, next){
next(new errors.NotFound(req.url));
});
function runApp() {
app.listen(config.listen.port, config.listen.host, function() {
console.log("SparkleShare Dashboard listening on port %d in %s mode", app.address().port, app.settings.env);
});
if (config.fanout.enabled) {
var fanout = require('./fanout/fanout');
fanout.listen(config.fanout.port, config.fanout.host, function() {
console.log("SparkleShare Fanout listening on port %d", config.fanout.port);
});
}
}
// upgrade database
require('./upgrade').upgrade(redisClient, runApp);
最佳答案
已修复:我将代码更改为:
var session = require('express-session')
, RedisStore = require('connect-redis')(session);
关于node.js - RedisStore.prototype.__proto__ = Store.prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22440020/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!