问题
I'm trying to use the node-mysql module to connect to my database. It was working fine, I updated my script (not even the connection script) and all in a sudden it can't locate the mysql module.
Here's my connection script, db_connect:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'officeball'
});
and for reference, here are the two scripts that I changed, login.js:
console.log('login module initialized');
var express = require('express');
var app = express();
var validator = require('./validator');
var username;
var password;
function listen(){
app.use(express.bodyParser());
app.post('/login', function(req, res) {
console.log('User ' + req.body.email + ' is attempting login...');
username = req.body.email;
password = req.body.password;
validator.validate(username,password);
if (validator.validate() === req.body.email){
res.writeHead(302, {'Location': 'http://localhost/officeball/app.php'});
}
res.end();
});
app.listen(8080, function() {
console.log('Server running at http://127.0.0.1:8080/');
});
}
exports.listen = listen;
and the main change, validator.js:
console.log('validator module initialized');
var login = require("./db_connect");
function validate(username, password, callback){
connection.connect(function (err){
console.log('Connection with the officeball MySQL database openned...');
if (err) return callback(new Error('Failed to connect'), null);
// if no error, you can do things now.
connection.query('select username,password from users where username=?',
username,
function(err,rows,fields) {
// we are done with the connection at this point), so can close it
connection.end();
console.log('...Connection with the officeball MySQL database closed.');
// here is where you process results
if (err)
return callback(new Error ('Error while performing query'), null);
if (rows.length !== 1)
return callback(new Error ('Failed to find exactly one user'), null);
// test the password you provided against the one in the DB.
// note this is terrible practice - you should not store in the
// passwords in the clear, obviously. You should store a hash,
// but this is trying to get you on the right general path
if (rows[0].password === password) {
// you would probably want a more useful callback result than
// just returning the username, but again - an example
return callback(null, rows[0].username);
} else {
return callback(new Error ('Bad Password'), null);
}
});
});
};
exports.validate = validate;
console log:
C:\xampp\htdocs\officeball\node_scripts>npm install node-mysql
npm http GET https://registry.npmjs.org/node-mysql
npm http 200 https://registry.npmjs.org/node-mysql
npm http GET https://registry.npmjs.org/node-mysql/-/node-mysql-0.3.7.tgz
npm http 200 https://registry.npmjs.org/node-mysql/-/node-mysql-0.3.7.tgz
npm http GET https://registry.npmjs.org/cps
npm http GET https://registry.npmjs.org/better-js-class
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/mysql
npm http 200 https://registry.npmjs.org/better-js-class
npm http GET https://registry.npmjs.org/better-js-class/-/better-js-class-0.1.3.
tgz
npm http 200 https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz
npm http 200 https://registry.npmjs.org/cps
npm http GET https://registry.npmjs.org/cps/-/cps-1.0.0.tgz
npm http 200 https://registry.npmjs.org/better-js-class/-/better-js-class-0.1.3.
tgz
npm http 200 https://registry.npmjs.org/mysql
npm http 200 https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz
npm http 200 https://registry.npmjs.org/cps/-/cps-1.0.0.tgz
npm http GET https://registry.npmjs.org/require-all/0.0.3
npm http GET https://registry.npmjs.org/readable-stream
npm http GET https://registry.npmjs.org/bignumber.js/1.0.1
npm http 304 https://registry.npmjs.org/require-all/0.0.3
npm http 304 https://registry.npmjs.org/readable-stream
npm http 200 https://registry.npmjs.org/bignumber.js/1.0.1
npm http GET https://registry.npmjs.org/bignumber.js/-/bignumber.js-1.0.1.tgz
npm http 200 https://registry.npmjs.org/bignumber.js/-/bignumber.js-1.0.1.tgz
npm http GET https://registry.npmjs.org/debuglog/0.0.2
npm http GET https://registry.npmjs.org/core-util-is
npm http GET https://registry.npmjs.org/string_decoder
npm http 304 https://registry.npmjs.org/core-util-is
npm http 304 https://registry.npmjs.org/string_decoder
npm http 304 https://registry.npmjs.org/debuglog/0.0.2
node-mysql@0.3.7 node_modules\node-mysql
├── better-js-class@0.1.3
├── cps@1.0.0
├── underscore@1.6.0
└── mysql@2.1.0 (require-all@0.0.3, readable-stream@1.1.11, bignumber.js@1.0.1)
C:\xampp\htdocs\officeball\node_scripts>node index.js
application initialized
server module initialized
login module initialized
validator module initialized
module.js:340
throw err;
^
Error: Cannot find module 'mysql'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (C:\xampp\htdocs\officeball\node_scripts\custom_module
s\db_connect.js:1:80)
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 Module.require (module.js:364:17)
C:\xampp\htdocs\officeball\node_scripts>node index.js
application initialized
module.js:340
throw err;
^
Error: Cannot find module 'mysql'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (C:\xampp\htdocs\officeball\node_scripts\index.js:4:18
)
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)
C:\xampp\htdocs\officeball\node_scripts>node index.js
application initialized
server module initialized
login module initialized
validator module initialized
module.js:340
throw err;
^
Error: Cannot find module 'mysql'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (C:\xampp\htdocs\officeball\node_scripts\custom_module
s\db_connect.js:1:80)
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 Module.require (module.js:364:17)
C:\xampp\htdocs\officeball\node_scripts>
What newbie mistake have I made?
回答1:
You are getting the npm package name confused (understandably, it's confusing in this case). The npm package name and the name you pass to require
will always exactly match, BUT that doesn't mean the github repo will be the same name. I think you want to do: npm install --save mysql
, which will give you the mysql
package, which happens to live in a github repo named node-mysql
. By coincidence and annoyance, there is also a completely different npm package named node-mysql
(which violates conventions and civic sensibility, but anyway), which I doubt is the one you want.
You should also do npm uninstall node-mysql
to clean up from your earlier mistake.
回答2:
You want npm install mysql
, not npm install node-mysql
The first one will install this module and the second one is installing this other one.
Note that looking at the console output you will see than node-mysql
installs mysql
, but it is only as an internal dependency.
Rule of thumb - your what
should be the same string
Command line:
npm install what
Javascript code
var what = require('what');
来源:https://stackoverflow.com/questions/22132245/node-cant-find-installed-mysql-module