Browse Source

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>
v4.0.0-rc
Brendan Ashworth 10 years ago
parent
commit
1afc0c9e86
  1. 15
      lib/fs.js
  2. 17
      test/parallel/test-fs-watchfile.js

15
lib/fs.js

@ -1305,13 +1305,12 @@ StatWatcher.prototype.stop = function() {
const statWatchers = new Map(); const statWatchers = new Map();
fs.watchFile = function(filename) { fs.watchFile = function(filename, options, listener) {
nullCheck(filename); nullCheck(filename);
filename = pathModule.resolve(filename); filename = pathModule.resolve(filename);
var stat; var stat;
var listener;
var options = { var defaults = {
// Poll interval in milliseconds. 5007 is what libev used to use. It's // 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 // a little on the slow side but let's stick with it for now to keep
// behavioral changes to a minimum. // behavioral changes to a minimum.
@ -1319,14 +1318,14 @@ fs.watchFile = function(filename) {
persistent: true persistent: true
}; };
if (arguments[1] !== null && typeof arguments[1] === 'object') { if (options !== null && typeof options === 'object') {
options = util._extend(options, arguments[1]); options = util._extend(defaults, options);
listener = arguments[2];
} else { } else {
listener = arguments[1]; listener = options;
options = defaults;
} }
if (!listener) { if (typeof listener !== 'function') {
throw new Error('watchFile requires a listener function'); throw new Error('watchFile requires a listener function');
} }

17
test/parallel/test-fs-watchfile.js

@ -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…
Cancel
Save