From f8f283b8f3ab9ce7d63bc473468190e15dc15a55 Mon Sep 17 00:00:00 2001 From: Sakthipriyan Vairamani Date: Wed, 27 Jul 2016 22:25:26 +0530 Subject: [PATCH] fs: warn if no callback is passed to async calls This patch issues a deprecation warning, if an asynchronous function is called without a callback function. PR-URL: https://github.com/nodejs/node/pull/7897 Reviewed-By: James M Snell Reviewed-By: Yorkie Liu Reviewed-By: Anna Henningsen --- lib/fs.js | 7 +++++ test/parallel/test-fs-make-callback.js | 40 ++++++++++++++++---------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index 2fc22b1bddecc0..d07116a9ea9812 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -83,6 +83,13 @@ function throwOptionsError(options) { } function rethrow() { + // TODO(thefourtheye) Throw error instead of warning in major version > 7 + process.emitWarning( + 'Calling an asynchronous function without callback is deprecated.', + 'DeprecationWarning', + rethrow + ); + // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and // is fairly slow to generate. if (DEBUG) { diff --git a/test/parallel/test-fs-make-callback.js b/test/parallel/test-fs-make-callback.js index 4fbe64437eaff0..6e4572ee352197 100644 --- a/test/parallel/test-fs-make-callback.js +++ b/test/parallel/test-fs-make-callback.js @@ -1,7 +1,7 @@ 'use strict'; -require('../common'); -var assert = require('assert'); -var fs = require('fs'); +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); function test(cb) { return function() { @@ -13,16 +13,26 @@ function test(cb) { // Verify the case where a callback function is provided assert.doesNotThrow(test(function() {})); -// Passing undefined calls rethrow() internally, which is fine -assert.doesNotThrow(test(undefined)); +process.once('warning', common.mustCall((warning) => { + assert.strictEqual( + warning.message, + 'Calling an asynchronous function without callback is deprecated.' + ); -// Anything else should throw -assert.throws(test(null)); -assert.throws(test(true)); -assert.throws(test(false)); -assert.throws(test(1)); -assert.throws(test(0)); -assert.throws(test('foo')); -assert.throws(test(/foo/)); -assert.throws(test([])); -assert.throws(test({})); + invalidArgumentsTests(); +})); + +// Passing undefined/nothing calls rethrow() internally, which emits a warning +assert.doesNotThrow(test()); + +function invalidArgumentsTests() { + assert.throws(test(null)); + assert.throws(test(true)); + assert.throws(test(false)); + assert.throws(test(1)); + assert.throws(test(0)); + assert.throws(test('foo')); + assert.throws(test(/foo/)); + assert.throws(test([])); + assert.throws(test({})); +}