fs: fix error on bad listener type
When the listener was truthy but NOT a function, fs.watchFile would throw an error through the EventEmitter. This caused a problem because it would only be thrown after the listener was started, which left the listener on. There should be no backwards compatability issues because the error was always thrown, just in a different manner. Also adds tests for this and other basic functionality. PR-URL: https://github.com/nodejs/io.js/pull/2093 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
12bc397207
commit
1afc0c9e86
15
lib/fs.js
15
lib/fs.js
@ -1305,13 +1305,12 @@ StatWatcher.prototype.stop = function() {
|
||||
|
||||
const statWatchers = new Map();
|
||||
|
||||
fs.watchFile = function(filename) {
|
||||
fs.watchFile = function(filename, options, listener) {
|
||||
nullCheck(filename);
|
||||
filename = pathModule.resolve(filename);
|
||||
var stat;
|
||||
var listener;
|
||||
|
||||
var options = {
|
||||
var defaults = {
|
||||
// Poll interval in milliseconds. 5007 is what libev used to use. It's
|
||||
// a little on the slow side but let's stick with it for now to keep
|
||||
// behavioral changes to a minimum.
|
||||
@ -1319,14 +1318,14 @@ fs.watchFile = function(filename) {
|
||||
persistent: true
|
||||
};
|
||||
|
||||
if (arguments[1] !== null && typeof arguments[1] === 'object') {
|
||||
options = util._extend(options, arguments[1]);
|
||||
listener = arguments[2];
|
||||
if (options !== null && typeof options === 'object') {
|
||||
options = util._extend(defaults, options);
|
||||
} else {
|
||||
listener = arguments[1];
|
||||
listener = options;
|
||||
options = defaults;
|
||||
}
|
||||
|
||||
if (!listener) {
|
||||
if (typeof listener !== 'function') {
|
||||
throw new Error('watchFile requires a listener function');
|
||||
}
|
||||
|
||||
|
17
test/parallel/test-fs-watchfile.js
Normal file
17
test/parallel/test-fs-watchfile.js
Normal file
@ -0,0 +1,17 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const assert = require('assert');
|
||||
|
||||
// Basic usage tests.
|
||||
assert.throws(function() {
|
||||
fs.watchFile('./some-file');
|
||||
}, /watchFile requires a listener function/);
|
||||
|
||||
assert.throws(function() {
|
||||
fs.watchFile('./another-file', {}, 'bad listener');
|
||||
}, /watchFile requires a listener function/);
|
||||
|
||||
assert.throws(function() {
|
||||
fs.watchFile(new Object(), function() {});
|
||||
}, /Path must be a string/);
|
Loading…
x
Reference in New Issue
Block a user